티스토리 뷰

Solved.ac Class 완전정복 프로젝트

Class : 2 ~ 2 ++

 

 


링크

https://www.acmicpc.net/problem/1259

 

1259번: 팰린드롬수

입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

www.acmicpc.net

문제

어떤 단어를 뒤에서부터 읽어도 똑같다면 그 단어를 팰린드롬이라고 한다. 'radar', 'sees'는 팰린드롬이다.

수도 팰린드롬으로 취급할 수 있다. 수의 숫자들을 뒤에서부터 읽어도 같다면 그 수는 팰린드롬 수다. 121, 12421 등은 팰린드롬 수다. 123, 1231은 뒤에서부터 읽으면 다르므로 팰린드롬수가 아니다. 또한 10도 팰린드롬수가 아닌데, 앞에 무의미한 0이 올 수 있다면 010이 되어 팰린드롬 수로 취급할 수도 있지만, 특별히 이번 문제에서는 무의미한 0이 앞에 올 수 없다고 하자.

입력
입력은 여러 개의 테스트 케이스로 이루어져 있으며, 각 줄마다 1 이상 99999 이하의 정수가 주어진다. 입력의 마지막 줄에는 0이 주어지며, 이 줄은 문제에 포함되지 않는다.

출력
각 줄마다 주어진 수가 팰린드롬 수면 'yes', 아니면 'no'를 출력한다.

 

접근방법

뒤집어도 같은 수열이라는 것을 보았을 때, 나는 데칼코마니를 생각했다. 팰린드롬수들은 내부에 기준 축을 잡으면, 완벽하게 대칭이 됨을 문제는 얘기한다. 이제 문제가 무엇을 요구하는지 이해하였는가?

누군가는 거꾸로 뒤집은 수랑 일치하면 되겠구나라고 생각할 수도 있다. 그것도 맞다. 정답은 하나가 아니니까.

나의 경우엔 그것도 변수 늘리기 싫어서 대칭을 이용했다. 이 풀이는 기준 축을 중심으로 대칭인지 아닌지를 판별하는 방식이다. 그렇게 인지하고 풀이에  들어가자.

풀이

기준축을 중앙에 그을 때, 아래와 같은 두 가지 경우가 생긴다.

 

길이가 홀수인지, 짝수인지에 따라 기준 축이 경계에 있느냐 마느냐가 결정된다. 나는 기준 축에 따라 코드를 나눠서 피해 가기가 싫어서, 대칭인 관계를 이용했다. 

 

 홀수 기준으로 [0] 번 인덱스는 가장 끝인 [4] 번 인덱스, 그다음은 서로 안쪽의 번호가 대칭 되게 된다.

배열의 길이가 N이라고 할 때, [0] 번 인덱스는 [N-1] 번과 대칭이 될 것이고, 그렇게 안쪽의 번호도 대칭이 될 것이다.

또한 왼쪽 표와 같이 N = 4 이든, N = 5 이든 쌍은 두 개밖에 없다. 즉, (int)(N / 2) 값이다.

그러니, 길이가 몇이든, 대칭인 쌍의 수는 [0] 번 인덱스부터 (N/2) 개가 나올 것이다.

나는 반복문을 그래서 절반만 돌렸다. 절반만 가면 나머지는 같은 수니까.

 

 

 

import java.util.Scanner;

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

    }

    public Main() {
        Scanner sc = new Scanner(System.in);
        //0나오기전까지 무한 반복
        while (true) {
            String number = sc.nextLine();

            //0 혹은 0으로 시작하는 무언가는 모두 out 처리
            if (number.equals("0")||number.charAt(0)=='0') {
                break;
            }
            solution(number);
        }

    }

    public void solution(String number) {
        boolean toggle = true;

            int len = number.length();
        //절반만 확인하면 됨
        for (int i = 0; i < (len/2); i++) {

            //[i] - 왼쪽 ,[len-1 -i] - 오른쪽 
            if (number.charAt(i) == number.charAt((len - 1) - i)) {

            } else {
                //하나라도 안되면 자름
                toggle = false;
                break;
            }
        }

        if (toggle) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }


    }


}

 

결과

어렵지 않은 문제임에도 꽤나 많이 실패했다. 사실 왜 실패했는지 도저히 이해가 안 갔다. 틀린게 없다고, 생각하니까 더 이해가 안갔다. 그런데 딱 하나가 달랐다. "Yes" 정말 본인이 맞았다고 생각할 때는 항상 출력을 의심해보자... 

 

 


포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.

더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.

읽어주셔서 감사합니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함