[코딩 테스트 RUN] SWEA 수업 : 1215. 회문1

코테런/SWEA(알고리즘 수업)
2026.03.10

 

⚠️ 주의!
SWEA에서 낸 코딩 문제에 대한 해답이 들어있습니다.
열람 시 주의해주세요.

 

 

[SW Expert Academy] 1215. 회문1

 

SW Expert Academy

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

swexpertacademy.com

 

8*8이므로 2중 배열을 사용하는 것이 편하다. 그리고 각 열과 행마다 회문을 확인하면 된다. 찾아야하는 회문 길이가 따로 주어짐에 유의하자. 그리고 회문이므로 절반만 체크해도 된다. 여기서 나는 같을 때마다 count하여 그게 N / 2가 되는지 확인했다. 다만 맨 아래에 있는 쪽이 더 효율적이므로 아래를 참고할 것.

 

정답

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = 10;
        for (int test_case = 1; test_case <= T; test_case++) {
            int N = Integer.parseInt(br.readLine()); // 찾아야하는 회문의 길이
            char[][] arr = new char[8][8];

            for (int i = 0; i < 8; i++) {
                String str = br.readLine();
                for (int j = 0; j < 8; j++) {
                    arr[i][j] = str.charAt(j);
                }
            } //문자 넣기 종료

            int totalCount = 0;

            for (int i = 0; i < 8; i++) { //가로 열을 추가한다
                for (int j = 0; j <= 8 - N; j++) {
                    int count = 0;
                    for (int k = 0; k < N / 2; k++) {
                        if(arr[i][j + k] == arr[i][j + N - 1 - k]){
                            count++;
                        }
                    }
                    if(count == N /2) { totalCount++; }
                }
            }

            for (int i = 0; i < 8; i++) { //세로 열을 추가한다
                for (int j = 0; j <= 8 - N; j++) {
                    int count = 0;
                    for (int k = 0; k < N / 2; k++) {
                        if(arr[j + k][i] == arr[j + N - 1 - k][i]){
                            count++;
                        }
                    }
                    if(count == N /2) { totalCount++; }
                }
            }

            sb.append("#").append(test_case).append(" ").append(totalCount).append("\n");

        } // 테스트케이스

        System.out.print(sb.toString());

    }
}

 

내가 제출한 답은 이건데, 더 경량화하는 방법이 있다. 전체의 가로세로 길이가 동일하므로 가로 및 세로 순회는 동일하게 하고, boolean으로 break 함으로써 조기탈출을 하는 것. 그리고 charAt으로 넣기보단 toCharArray를 처리하는 쪽이 조금 더 빠르다.

 

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int T = 10;
        for (int test_case = 1; test_case <= T; test_case++) {
            int N = Integer.parseInt(br.readLine()); // 찾아야하는 회문의 길이
            char[][] arr = new char[8][8];

            for (int i = 0; i < 8; i++) {
                String str = br.readLine();
                for (int j = 0; j < 8; j++) {
                    arr[i] = str.toCharArray();
                }
            } //문자 넣기 종료

            int totalCount = 0;

            for (int i = 0; i < 8; i++) { //가로 및 세로가 동일하므로 한번에 처리 가능
                for (int j = 0; j <= 8 - N; j++) {
                    boolean rowOk = true;
                    boolean colOk = true;

                    for (int k = 0; k < N / 2; k++) {
                        if (arr[i][j + k] != arr[i][j + N - 1 - k]) rowOk = false;
                        if (arr[j + k][i] != arr[j + N - 1 - k][i]) colOk = false;
                        if (!rowOk && !colOk) break;
                    }

                    if (rowOk) totalCount++;
                    if (colOk) totalCount++;
                }
            }

            sb.append("#").append(test_case).append(" ").append(totalCount).append("\n");

        } // 테스트케이스

        System.out.print(sb.toString());

    }
}