본문 바로가기
알고리즘 풀이

[백준] 10988번: 팰린드롬인지 확인하기 - java 풀이 / 주소값 비교(==) 와 대상 값 비교(equals)

by 코디드 2023. 6. 22.

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 를 사용해준다.