StringBuilder.reverse() 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringBuilder sb = new StringBuilder(str);
if(str.equals(sb.reverse().toString())) {
System.out.println(1);
}else {
System.out.println(0);
}
}
}
StringBuilder.reverse()를 이용해 단어를 뒤집어준다.
StringBuilder 타입이 되기 때문에 원래 입력받은 단어의 타입인 String과 비교 하기 위해서는 toString()을 해줘야 한다.
주소값 비교(==) 와 대상 값 비교(equals)
'level'을 입력하고 조건문 if(str==sb.reverse().toString())을 처리했는데 결과가 0 이 나왔다.
그래서 str과 sb.reverse().toString()을 각각 찍어봤는데 둘다 'level'이라고 나왔다.
== 연산자는 두 대상의 주소값을 비교하고, String.equals()는 두 대상의 값 그 자체를 비교한다.
그럼 왜 그동안 정수를 비교할 때는 == 를 써도 괜찮았을까 하고 공부해보니, 기본 타입의 int, char 형 등은 Call by Value 형태로 주소값을 갖지 않는 형태로 사용된다고 한다. String의 경우, 리터럴을 이용하면 == 연산자를 사용해도 초기화된 값이 같다면 '두 대상이 서로 동일하다' 라는 결과가 나온다. 하지만 String객체를 생성할 경우, Call by Reference 형태로 생성되어 주소값이 부여된다고 한다.
예를 들어,
String str1 = "wow"; 와 String str2="wow" 는 == 연산자를 사용할 경우 두 값이 동일하다고 나오지만, String str3 = new String("wow"); 는 == 연산자를 사용하여 str1 또는 str2와 비교할 경우 주소값이 달라져 값이 같지 않다는 결과가 나온다.
그렇기 때문에 == 연산자로 비교할 경우 각각 str과 sb.reverse().toString()의 주소값을 달라 0이 출력된 것이었다.
그래서, String 타입을 비교할 때는 equals()를 사용해서 값 자체를 비교하게 해준다.
참고: https://coding-factory.tistory.com/536
[Java] 문자열 비교하기 == , equals() 의 차이점
Java에서 int와 boolean과 같은 일반적인 데이터 타입의 비교는 ==이라는 연산자를 사용하여 비교합니다. 하지만 String처럼 Class의 값을 비교할때는 ==이 아닌 equals()라는 메소드를 사용하여 비교를 합
coding-factory.tistory.com
반복문 풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String[] strA = str.split("");
int i=0;
int j=strA.length-1;
while(i<j) {
String temp=strA[i];
strA[i++]=strA[j];
strA[j--]=temp;
}
StringBuilder sb = new StringBuilder();
for(String k : strA) {
sb.append(k);
}
if(str.equals(sb.toString())) {
System.out.println(1);
}else {
System.out.println(0);
}
}
}
split()을 통해 배열에 넣어준다. 그 후, 첫번째 데이터와 가장 끝에 있는 데이터를 교환, 두번째 데이터와 뒤에서 두번째 데이터를 교환... 배열/2 -1 번째 값과 배열/2+1 번째 값까지 서로 바꿔 준 후, 바뀐 단어와 기존에 입력 받은 단어를 비교해준다. Stringbuilder의 경우 String과 비교하려면 반드시 toString을 해주고 서로 비교할때는 equals 를 사용해준다.
'알고리즘 풀이' 카테고리의 다른 글
[백준] 1157번: 단어 공부 - java 풀이 (0) | 2023.06.27 |
---|---|
[백준] 25206번: 너의 평점은 - java 풀이 (0) | 2023.06.22 |
[백준] 2444번: 별 찍기 - 7 - java 풀이 (0) | 2023.06.21 |
[백준] 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 - java 풀이 (0) | 2023.06.21 |
[백준] 2908번: 상수 - java 풀이 (0) | 2023.06.21 |