📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

[백준 1025번] 제곱수 찾기 본문

코딩테스트/백준

[백준 1025번] 제곱수 찾기

seung_ho_choi.s 2025. 5. 27. 22:54
728x90

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

 

package bra;

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

public class Bra1025 {
    static int N;

    static int M;

    static int[][] num;

    static int[] dx = {-1, -1, -1, 0, 0, 1, 1, 1};

    static int[] dy = {-1, 0, 1, -1, 1, -1, 0, 1};

    static int result;

    static boolean flag;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        num = new int[N][M];

        for (int i = 0; i < N; i++) {
            String input = br.readLine();
            for (int j = 0; j < M; j++) {
                num[i][j] = input.charAt(j) - '0';
            }
        }


        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if (isSqrt(num[i][j])) {
                    result = Math.max(num[i][j], result);
                }
                slove(i, j);
            }
        }

        if (flag) {
            System.out.println(result);
        } else {
            System.out.println(-1);
        }


    }

    private static void slove(int x, int y) {


        for (int k = 1; k < N+1; k++) {
            for (int l = 1; l < M+1; l++) {
                // 방향
                for (int dir = 0; dir < 8; dir++) {
                    StringBuilder sb = new StringBuilder(String.valueOf(num[x][y]));
                    int nextX = x;
                    int nextY = y;
                    while (true) {
                        nextX += dx[dir] * k;
                        nextY += dy[dir] * l;

                        if (nextX < 0 || nextX >= N || nextY < 0 || nextY >= M) {
                            break;
                        }


                        sb.append(String.valueOf(num[nextX][nextY]));
                        if (isSqrt(Integer.parseInt(sb.toString()))) {
                            result = Math.max(Integer.parseInt(sb.toString()), result);
                        }

                    }
                }
            }

        }
    }

    private static boolean isSqrt(int num) {
        double sqrt = Math.sqrt(num);
        if (sqrt == Math.floor(sqrt)) {
            flag = true;
        }
        return sqrt == Math.floor(sqrt);
    }


}

 

 

와... 6중 for문까지 쓰게 되다니. 확실히 이 문제는 그런 식의 전개를 요구하는 듯하다. 역시 브루트포스 알고리즘의 전형이다.
핵심은 숫자가 완전제곱수인지 판별할 때 Math.sqrt() 결과와 Math.floor()를 비교하는 방식으로 확인하면 된다는 점이다.
단, 모든 경우의 수를 탐색할 때는 dx, dy를 활용해 모든 방향의 등차수열을 꼼꼼히 확인해야 한다.

728x90

'코딩테스트 > 백준' 카테고리의 다른 글

[백준 16234번] 인구 이동  (0) 2025.05.30
[백준 15685번] 드래곤 커브  (0) 2025.05.29
[백준 2467번] 용액  (0) 2025.05.24
[백준 15684번] 사다리 조작  (0) 2025.05.24
[백준 15683번] 감시  (0) 2025.05.21