[백준알고리즘] 문자열 - 2908 상수 문제
문제 자체는 쉽게 풀었으나
다른 사람의 코드를 보고 얻어간것들을 조금이라도 더 작성하고자 한다.
오해하고 있었던 점이, nextInt()와 같은 메서드들을 여러번 사용하여 입력받을때
엔터로 줄바꿈을 해서 구분해야 한다고 생각했다.
그런데 꼭 그게 아니더라도 스페이스바(공백)로 구분해줘도 된다.
nextInt는 공백(스페이스바), 탭문자, 개행문자(엔터)를 구분으로 해서 입력을 받는다.
물론 이 구분자들을 가져오지는 않는다. (그래서 다음에 nextLine이 오게되면 문제발생 여지가 있는것)
next()도 마찬가지
나는 bufferedReader의 readLine()이 더 빠를 듯 하기도 해서,그리고 어차피 문자열로 바꿔야해서 이를 사용하긴 했으나
아무튼 참고해두자.
문제는 다음과 같이 풀었다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String input = br.readLine();
String reverseStr = "";
for(int i=input.length()-1; i>=0; i--){
reverseStr += input.charAt(i); //문자를 거꾸로 다시 만듦. 자동형변환 가능??
}
String[] words = reverseStr.split(" ");
if(Integer.parseInt(words[0]) > Integer.parseInt(words[1])){
bw.write(words[0]);
}else{
bw.write(words[1]);
}
bw.flush();
bw.close();
}
}
입력받은 문자열들을 거꾸로 배치하기 위해 우선 한줄을 readLine으로 다 입력받고,
문자열 길이 - 1의 인덱스부터(이거 실수했었다..문자열 length에서 하나를 빼줘야 마지막 인덱스값이 되겠지)
0까지 쭉 뒤에서 앞의 순서의 문자를 reverseStr에다 +=연산자를 이용해 추가해주었다.
그렇게하면 중간에 공백을 포함하여 원래 입력받은 문자열이 뒤집힌 상태가 될 테니
문자열의 각 세자리 수들을 각각 쪼개기 위하여 split으로 공백기준 나누어 배열에 담고,
배열에 세자리 수 두개가 담기게 될 테니 0번, 1번 배열값을 서로 비교하고
걍 0번이 더 크면 그걸 출력하고 아니라면 1번이 출력되게끔 했다.
.
.
다른 사람의 코드를 보고 느꼈거나 알아야겠다고 생각한 부분들.
1. 자바의 StringBuilder란 무엇이고 어떤 기능일까??
A = Integer.parseInt(new StringBuilder().append(A).reverse().toString());
누군가 위와같은 방식으로 문자열을 뒤집고 StringBuilder에 append한뒤 int형으로 바꾸어 풀었더라.
(StringBuilder는 int형도 받을 수 있구나..)
StringBuilder는 불변의 객체라고 하는데, +연산자를 이용하여 두개의 String을 더하고자 한다면
새로운 String 객체를 생성해야한다.
이는 메모리 할당과 해제를 발생시키며 이러한 더하기 연산이 많아질수록 성능이 저하될 우려가 있다고 한다.
그리하여 나온것이 StringBuilder고, 문자열과 문자열을 더할때 새로운 객체를 생성하지 않고 기존 데이터에
더하는 방식이라 여러모로 좋은 방식이라는것 같다.
append 말고도 관련하여 여러 메소드들이 있으니 써보면 좋을것같다.
2. 삼항 연산자를 이용하자 : (A > B ? A : B);
주로 if-else문을 사용해왔는데, 이 방식으로 작성하면 더욱 간결하다는점을 자꾸 잊고 산다
형식은
(조건식) ? (반환값1) : (반환값2)
과 같은 형식.