ezhoon

[인프런] 01-07 회문문자열 본문

[Java] 인프런 문제풀이/Stirng(문자열)

[인프런] 01-07 회문문자열

ezhoon 2022. 1. 18. 23:31

문제


  1. 첫 줄에 길이 100이 넘지 않는 공백이 없는 문자열 입력
  2. 회문 문자열이면 "YES" 아니면 "NO" 출력

 

더보기
더보기

회문 문자열이란

회문이란 앞으로 읽으나 뒤로 읽으나 문장이 같을 때 이 문자열을 회문이라고 합니다.

예로 "wow"라는 문자열을 앞으로 읽어나 뒤로 읽으나 같은 문자열입니다. 이걸 코딩을 한다면 어떻게 해야 할지 고민해보기

 

이해


  1. 새로운 String 객체를 만들어서 입력된 값의 반대로 저장한 후 원래 문자와 비교하는 방법
  2. 0번째와 마지막, 첫 번째와 마지막-1 ~~ 쭉 비교해서 다 같으면 YES 다르면 FALSE 리턴하는 방법
    • gooG이 입력됐다고 생각하면 아래와 같이 풀 수 있다.
    • 즉 0번째와 마지막 문자 / 1번째와 마지막-1 ~~ 이렇게 쭉 비교해서 결괏값을 출력해주면 된다.
    • g와 G를 비교 -> o와 o를 비교 -> 전부 동일하다면 YES를 출력하는 것이다.

 

⚠️주의사항


  • 대소문자 구분하지 않기
  • YES / NO 정확히 오타 없이 정확히 출력하기

 

문제풀이


1. 문제 보고 직접 풀어본 풀이입니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java01_07 {

    public String solution(String str) {
        str = str.toLowerCase(); // 대소문자 통일을 위해서 소문자 or 대문자로 변환
        String answer = ""; // YES NO 저장
        String backWord = ""; // reverse 글자 저장
        int j = 0;

        for (int i = str.length() - 1; i >= 0; i--) { // 뒤에서부터 저장하기
            backWord = backWord + str.charAt(i);

            if (backWord.charAt(j) == str.charAt(j)) answer = "YES";
            else answer = "NO";

            j++;
        }
        return answer;
    }

    public static void main(String[] args) throws IOException {
        Java01_07 T  = new Java01_07();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        System.out.print(T.solution(str));

    }
}

문제의 난이도에 비해서 코드가 너무 길고 난잡한 것 같아 보여서 더 좋은 코드도 갖고 왔습니다.


2.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java01_07 {

    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)) answer = "NO"; // gooG을 예시로 0번째로 3번째를 비교하는 것 이기 때문에 len-i-1로 비교한다.
        }

        return answer;
    }

    public static void main(String[] args) throws IOException {
        Java01_07 T  = new Java01_07();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        System.out.print(T.solution(str));

    }
}

3.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Java01_07 {

    public String solution(String str) {
        String answer = "NO";
        String tmp = new StringBuilder(str).reverse().toString();
        if (str.equalsIgnoreCase(tmp)) answer = "YES"; // 단순 equals 하면 대소문자 구분때문에 오류가 난다 -> equalsIgnoreCase 사용하기

        return answer;
    }

    public static void main(String[] args) throws IOException {
        Java01_07 T  = new Java01_07();

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();

        System.out.print(T.solution(str));

    }
}

출력화면

 

Comments