띠오니 개발자 성장일지
article thumbnail
반응형

인프런의 "자바(Java) 알고리즘 문제풀이 : 코딩테스트 대비" 강좌를 수강했습니다.

 


 

Q1-07. 회문 문자열

앞으로 읽으나 뒤로 읽으나 똑같은 단어를 '회문 문자열' 이라고 한다. (내 이름은 이효리 거꾸로 해도 이효리...)
입력된 문자열이 회문 문자열이면 "YES"를, 아니면 "NO" 라고 출력하자
단, 입력된 문자열은 공백이 없고 대소문자를 구분하지 않는다.

 

 

✏️ 내가 쓴 답

예를 들어 reveR 라는 회문 문자열이 입력 됐을 때, v를 중심으로 양 좌우에 있는 문자가 같아야 하기 때문에 맨앞과 맨뒤의 인덱스 값부터 시작해 인덱스를 증감시키면서 문자를 비교하는 방법으로 해결했다. abccba 와 같은 중심문자가 하나로 특정되지 않는 짝수개의 문자가 입력되어도 상관 없다. 대소문자 구분 상관없다는 점도 잊지 말자 !

answer이 회문 문자열인지 아닌지 두가지 케이스를 비교하기 보다는, answer을 YES로 초기화 하고 회문 문자열이 아닌경우만 NO로 변경하면 더 간편한 로직이 된다.

str.toCharArray() 로 문자 배열을 만들어 사용했는데, 이것 말고 str.charAt() 을 이용할 수도 있다.

결과는 정답✅

import java.util.Scanner;

public class Main {

    public String solution(String str){
        
        String answer = "YES";

        str = str.toLowerCase();
        char[] cArr = str.toCharArray();

        int lt = 0, rt = str.length()-1;

        while(lt < rt){
            if(cArr[lt] != cArr[rt]){		// str.charAt()을 사용해도 된다
                answer = "NO";
                break;
            } else {
                lt++;
                rt--;
            }
        }

        return answer;
    }

    public static void main(String[] args){
        Main main = new Main();

        Scanner sc = new Scanner(System.in);
        String str = sc.next();

        System.out.println(main.solution(str));
    }
    
}

 

 

 

👨🏻‍🏫 추가 코드

선생님이 풀어주신 방법은 이랬다.

첫 번째 방법

이 것도 내가 한 방법처럼 똑같이, 중앙을 기준으로 앞문자와 뒷문자를 비교하는 방법이다.

똑같이 answer="YES" 초기화 하고 입력된 문자열을 소문자(혹은 대문자)로 변경한다.

for문 조건의 i<len/2 이 부분은, 중앙을 기준으로 단어의 앞부분 문자 개수만큼만 뒷부분 문자를 비교하면 되기 때문에 len를 2로 나눈다.

예를 들어 abccba 라는 단어면 length=6, len/2 =3 이고 str.charAt(0), str.charAt(1), str.charAt(2) 이 세개의 문자로만 비교하면 된다.

public String solution(String str) {
	String answer = "YES";
    str = str.toLowerCase();
    int len = str.length();
    
    for(int i=0; i<len/2; i++) {	// 단어의 절반까지만 체크
    	if(str.charAt(i) != str.charAt(len-i-1)) return "NO";
        
    return answer;
}

 

반응형

 

두 번째 방법

사실은 제일 쉬운 방법. 내 이름은 이효리, 거꾸로 해도 이효리. 단어를 뒤집어서 원래 문자와 같은지 확인하면 된다.

StringBuilder 객체를 이용해서 문자열을 뒤집어준다. 

이 때 사용한 equalsIgnoreCase(String str)은 해당 문자열이 str과 대소문자 구분 없이 같은 문자열인지 확인하는 메소드이다.

public String solution(String str) {
	String answer = "YES";
    
    String tmp = new StringBuilder(str).reverse().toString();
    if(str.equalsIgnoreCase(tmp)) answer ="NO";
    
    return answer;
}

 

 

 

🤓 정리

  • String 객체의 equalsIgnoreCase()는 대소문자 상관없이 같은 문자열인지 비교할 때 사용하는 메소드이다.
  • for문의 조건문 등을 자유자재로 사용할 줄 알아야 하겠다.

 

 

 

 


조금씩이라도 문제를 풀고 정리하는게 귀찮긴 해도 재미있다. 
좀 더 발전된 내일의 나, 모레의 더 멀리의 나를 상상해보며 더 열심히 해야겠다 🤓

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!