백준 | 10988

최근에는 문제가 잘못된 경우에도 예외를 고려하지 않는 것이 문제입니다.

제가 직접 풀었기 때문에 오답에 대한 메모를 작성할 필요가 없었습니다.

오늘은 오랜만에 놀래서 오답노트를 적어보려고 합니다.


백준 10988호 확인

문제

소문자 단어가 주어지면 문제는 주어진 단어가 회문인지 여부를 결정하는 것입니다.

회문(palindrome)은 앞뒤로 읽어도 같은 단어입니다.

회문인 단어에는 level과 noon이 포함됩니다.

주어진 단어가 팰린드롬이면 1, 그렇지 않으면 0을 반환합니다.

내 첫 번째 시도에 대한 의사 코드는 다음과 같습니다.

1. 단어를 입력 받아 String 타입 변수 word에 할당한다.
2. 주어진 단어의 길이를 이용해 중간값을 int 타입 변수로 선언한다.
   홀수인 경우 중간값은 (word.length()-1)/2
3. 팰린드롬인지 아닌지 판단할 boolean 타입 변수 isPalindrome을 선언한다.
4. 두 글자가 같은 글자면 isPalindrome = true 아니면 isPalindrome = false
5. 반복문이 끝났을 때 isPalindrome가 true면 1을 출력하고 false면 0을 출력한다.

처음 시도에서 두 가지 실수했다

1. 주어진 단어가 모두 이상하다는 착각

2. 이전 부분에서 틀린 것으로 밝혀져도 이후 비교에서 같으면 참이 됩니다.

이것은 두 번째 시도에서 수정되었습니다.

1. 단어를 입력 받아 String 타입 변수 word에 할당한다.
2. 주어진 단어의 길이를 이용해 중간값을 int 타입 변수로 선언한다.
   홀수인 경우 중간값은 (word.length()-1)/2
3. 팰린드롬인지 아닌지 판단할 boolean 타입 변수 isPalindrome을 선언한다.
4. 글자수가 홀수인 경우와 짝수인 경우를 나누어 반복문의 범위를 달리한다.
5. 두 글자가 같은 글자면 isPalindrome = true 아니면 isPalindrome = false
6. false인 경우 break;로 반복문을 중단한다.
7. 반복문이 끝났을 때 isPalindrome가 true면 1을 출력하고 false면 0을 출력한다.

수정된 코드는 아래와 같으며 투고결과 99%에서 “Wrong!”이 나왔다.

public class Main {
    public static void main(String() args) {
    	BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String word = reader.readLine();
        reader.close();

        int n = (word.length() - 1) / 2;
        boolean isPalindrome = true;

        if (word.length() % 2 != 0) {
            for (int i = 0; i < n; i++) {
                if ((word.charAt(i)-0) == (word.charAt(word.length()-1-i)-0)) {
                    isPalindrome = true;
                } else {
                    isPalindrome = false;
                    break;
                }
            }
        } else {
            for (int i = 0; i <= n; i++) {
                if ((word.charAt(i)-0) == (word.charAt(word.length()-1-i)-0)) {
                    isPalindrome = true;
                } else {
                    isPalindrome = false;
                    break;
                }
            }
        }

        if (isPalindrome) {
            System.out.println(1);
        } else {
            System.out.println(0);
        }
    }
}

영어를 마스터하기 위해 애를 썼지만 시간을 내서 검색을 했고, 천 번을 잘 찾았다.

가라앉는 블로그

이 분의 코드를 보면서 컴퓨팅 사고력이 그런 것인지 궁금했습니다.

필요하지 않은 간결하고 깔끔하게 정리된 코드.

이렇게 보고 정리했습니다.

1. 주어진 단어의 홀짝과 관계없이 (주어진단어의 길이/2)까지만 비교하면 간단해진다.

    (주어진 단어의 글자수가 6일때 3까지 비교, 7일때도 3까지 비교)

2. 출력결과가 0과 1인 점을 이용해 팰린드롬 인지 아닌지를 판단해줄 변수를 int타입으로 선언.

3. 초기화값을 참인 경우 1로 할당한 후, 반복문을 돌며 글자가 다른 경우 0을 할당. 

4. 팰린드롬 판단 변수값을 출력
public class Main {
    public static void main(String() args) {
        Scanner scanner = new Scanner(System.in);
        String word = scanner.next();
        int mid = word.length() / 2;
        int isPalindrome = 1;
        
        for (int i = 0; i < mid; i++) {
            if (word.charAt(i) != word.charAt(word.length() - 1 - i)) {
                isPalindrome = 0;
            }
        }
        System.out.println(isPalindrome);
    }
}

어제 나는 나의 수학 사고력에 대해 생각하다가 잠이 들었다.

오늘 일어났을 때 충격을 받았습니다.

알고리즘을 좀 더 적극적으로 공부해야 합니다.