개발놀이터

1-7. 회문 문자열 본문

기타/코딩테스트

1-7. 회문 문자열

마늘냄새폴폴 2023. 2. 9. 12:10

package string.CircleString17.my;

import java.util.Scanner;

public class Main {

    /**
     * -나의 풀이-
     * 이전 시간에 배웠던 lt 와 rt 의 개념을 도입해서 각각의 문자가 다르면 checkPoint 를 1 증가시켜서
     * 최종적으로 0이면 (증가하지 않으면 -> 각각의 문자가 같으면) YES 를 리턴, 0이 아니면 NO 를 리턴
     *
     * --피드백--
     * 음... 문제는 맞았다. 하지만 알고리즘, 자료구조를 사용했다는 느낌은 전혀 받을 수 없었음
     * 그냥 꼼수같은 느낌..? 이거 실제로 코딩테스트에서 제출하면 답은 맞지만 높은 점수는 주지 않을듯 함
     *
     * -선생님의 풀이-
     * 1. 전체 길이 / 2 한만큼까지 for 문을 돌려서 앞 뒤를 charAt 으로 비교 했음
     * 2. 앞선 시간에서 배웠던 StringBuilder 에 reverse 메서드로 tmp 라는 새로운 변수에 저장한 후
     *    기존 문자열과 tmp 를 equalsIgnoreCase (대소문자와 관계없이 equals 비교) 를 이용하여 비교 후 YES 혹은 NO 리턴
     *
     * --코드리뷰--
     * 1번 풀이는 내 풀이와 크게 다르지 않은 듯 함 2번 풀이가 개인적으로 맘에 듦
     */

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String input = kb.next();

        System.out.println(solution(input));
    }

    private static String solution(String input) {
        int lt = 0, rt = input.length() - 1;
        char[] c = input.toCharArray();
        int checkPoint = 0;

        while (lt < rt) {
            char left = Character.toLowerCase(c[lt]);
            char right = Character.toLowerCase(c[rt]);

            if (left != right) {
                checkPoint++;
            }

            lt++;
            rt--;
        }

        if (checkPoint == 0) {
            return "YES";
        }
        else {
            return "NO";
        }
    }
}

↑ 내풀이

package string.CircleString17.teacher;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String str = kb.next();

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

    private static String solution(String str) {
        String answer = "NO";
        String tmp = new StringBuilder(str).reverse().toString();

        if (str.equalsIgnoreCase(tmp)) return answer = "YES";

        /*
        String answer = "YES";
        int len = str.length();
        str = str.toUpperCase();

        for (int i = 0; i < len / 2; i++) {
            if (str.charAt(i) != str.charAt(len - i - 1)) {
                return "NO";
            }
        }
        */

        return answer;
    }
}

↑ 선생님 풀이

 

package string.CircleString17.my;

import java.util.Scanner;

public class Refactoring {

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        String input = kb.next();

        System.out.println(solution(input));
    }

    private static String solution(String input) {
        int lt = 0, rt = input.length() - 1;
        input = input.toLowerCase();
        char[] c = input.toCharArray();
//        int checkPoint = 0;   기존의 checkPoint 삭제

        while (lt < rt) {
//            char left = Character.toLowerCase(c[lt]);     각각을 소문자로 변경하는 것이 아니라 일단 input 을 소문자로
//            char right = Character.toLowerCase(c[rt]);    변경함

            if (c[lt] != c[rt]) {   // left != right 에서 현재 코드로 변경경
                return "NO";
            }

            lt++;
            rt--;
        }

        return "YES";
    }
}

↑ 리팩토링

 

'기타 > 코딩테스트' 카테고리의 다른 글

1-9. 숫자만 추출  (0) 2023.02.09
1-8. 유효한 회문 문자열  (0) 2023.02.09
1-6. 중복된 문자 제거  (0) 2023.02.07
1-5. 특정 문자 뒤집기  (0) 2023.02.07
1-4. 단어 바꾸기  (0) 2023.02.07