영원히 남는 기록, 재밌게 쓰자

SWEA D3 [10570] 제곱 팰린드롬 수 본문

Algorithm/SWEA

SWEA D3 [10570] 제곱 팰린드롬 수

youngjae-kim 2024. 4. 11. 12:40
728x90
반응형

 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

풀이

펠린드롬을 판별하는 로직이 계속 손에 익지 않았다..

 

  • 해당 문자열 길이의 절반 만큼 반복한다.
  • 해당 인덱스의 문자와 중심 인덱스를 기준으로 반대의 문자를 다음과 같이 잡는다.
str.length() - 1 - i -> (전체 길이) - (해당 인덱스)

 

펠린드롬 확인 로직 전체 코드

for (int i = 0; i < str.length() / 2; i++) {
    if (str.charAt(i) != str.charAt(str.length() - 1 - i)) {
        return false;
    }
}

 

놓친 부분

문제에서 양의 정수에 대해서 펠린드롬을 구해야 하므로 제곱근이 정수인지 판별을 하기 위해 올림이나 내림을 했을 때

정수값이 동일한 경우 int로 형변환 후 제곱근에 대해서 펠린드롬을 검사했다.

double sqrtNum = Math.sqrt(num);

if (sqrtNum != Math.ceil(sqrtNum)) { // 제곱근이 정수인지 검사해야 함
    return false;
}

 

 

정답 코드

package com.swea.D3.p10570;

import java.io.*;
import java.util.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        for (int t = 1; t <= T; t++) {
            sb.append("#" + t + " ");
            st = new StringTokenizer(br.readLine());

            int A = Integer.parseInt(st.nextToken());
            int B = Integer.parseInt(st.nextToken());

            int cnt = 0;

            for (int i = A; i <= B; i++) {
                if (isPalindrome(i)) {
                    cnt++;
                }
            }

            sb.append(cnt + "\n");
        }

        System.out.println(sb);
    }

    static boolean isPalindrome(int num) {
        String str = String.valueOf(num);
        for (int i = 0; i < str.length() / 2; i++) {
            if (str.charAt(i) != str.charAt(str.length() - 1 - i)) {
                return false;
            }
        }

        double sqrtNum = Math.sqrt(num);

        if (sqrtNum != Math.ceil(sqrtNum)) { // 제곱근이 정수인지 검사해야 함
            return false;
        }

        str = String.valueOf((int) Math.sqrt(num));
        for (int i = 0; i < str.length() / 2; i++) {
            if (str.charAt(i) != str.charAt(str.length() - 1 - i)) {
                return false;
            }
        }

        return true;
    }

}
728x90
반응형