[SWEA] 1215. 회문1

1 분 소요

문제 링크

[SWEA] 1215. 회문1


풀이 과정

회문(Palindrome)을 고르는 문제입니다.


for (int i = 0; i < SIZE; i++) {
    for (int j = 0; j < SIZE; j++) {
        StringBuilder sb = new StringBuilder();

        if (j + N <= SIZE) {
            for (int y = j; y < j + N; y++) sb.append(map[i][y]);
            if (check(sb.toString().toCharArray())) cnt++;
        }

        sb = new StringBuilder();

        if (i + N <= SIZE) {
            for (int x = i; x < i + N; x++) sb.append(map[x][j]);
            if (check(sb.toString().toCharArray())) cnt++;
        }
    }
}

좌표 (i, j)를 기준으로 오른쪽과 밑쪽으로 각각 회문을 확인합니다.


static boolean check(char[] s) {
    int left = s.length / 2 - 1, right = s.length % 2 == 0 ? s.length / 2 : s.length / 2 + 1;

    while (left >= 0 && right <= s.length - 1) {
        if (s[left] != s[right]) return false;

        left--;
        right++;
    }

    return true;
}

check 메소드 는 입력받은 문자 배열 s가 회문을 형성하면 true를, 아니면 false를 리턴합니다. 중앙을 기준으로 왼쪽과 오른쪽을 left, right로 설정하고 한 칸씩 떨어뜨리면서 문자열의 끝까지 진행하는 방식으로 회문을 확인합니다.


코드

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

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

        for (int tc = 1; tc <= 10; tc++) {
            int N = stoi(br.readLine());
            char[][] map = new char[SIZE][SIZE];
            int cnt = 0;

            for (int i = 0; i < SIZE; i++) map[i] = br.readLine().toCharArray();

            for (int i = 0; i < SIZE; i++) {
                for (int j = 0; j < SIZE; j++) {
                    StringBuilder sb = new StringBuilder();

                    if (j + N <= SIZE) {
                        for (int y = j; y < j + N; y++) sb.append(map[i][y]);
                        if (check(sb.toString().toCharArray())) cnt++;
                    }

                    sb = new StringBuilder();

                    if (i + N <= SIZE) {
                        for (int x = i; x < i + N; x++) sb.append(map[x][j]);
                        if (check(sb.toString().toCharArray())) cnt++;
                    }
                }
            }

            System.out.println("#" + tc + " " + cnt);
        }
    }

    static int stoi(String s) {
        return Integer.parseInt(s);
    }

    static boolean check(char[] s) {
        int left = s.length / 2 - 1, right = s.length % 2 == 0 ? s.length / 2 : s.length / 2 + 1;

        while (left >= 0 && right <= s.length - 1) {
            if (s[left] != s[right]) return false;

            left--;
            right++;
        }

        return true;
    }
}

카테고리:

업데이트:

댓글남기기