백준 사토르 마방진

KIMYEONGJUN·2025년 11월 5일
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 단어의 길이 N이 주어진다. (2 ≤ N ≤ 100)
둘째 줄부터 N개의 줄에 걸쳐 단어 집합의 각 행의 단어들이 공백 없이 주어진다.
단어들은 알파벳 대문자로만 이루어져 있다.

주어진 단어 집합이 사토르 마방진이면 "YES", 아니면 "NO"를 출력한다. (따옴표 제외)

내가 이 문제를 보고 생각해본 부분

BufferedReader 초기화:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
표준 입력(키보드)으로부터 데이터를 읽어오기 위한 BufferedReader 객체를 생성한다.
N 값 읽기:
int N = Integer.parseInt(br.readLine());
첫 번째 줄에서 N 값을 읽어들여 정수로 변환하여 N 변수에 저장한다. 
N은 마방진의 크기를 나타낸다.
char[][] grid 2차원 배열 선언:
char[][] grid = new char[N][N];
입력받을 단어 집합(마방진)의 문자들을 저장할 N행 N열 크기의 2차원 문자 배열 grid를 선언한다.
grid 배열 채우기:
for(int i = 0; i < N; i++) 외부 반복문은 N개의 행을 순회한다.
String line = br.readLine(); 각 행마다 한 줄의 문자열을 읽어 line 변수에 저장한다.
for(int j = 0; j < N; j++) 내부 반복문은 현재 행의 N개 문자를 순회한다.
grid[i][j] = line.charAt(j); 읽어들인 문자열 line에서 j번째 문자를 가져와 grid[i][j] 위치에 저장한다. 
이렇게 하면 모든 입력 문자가 grid 배열에 차곡차곡 쌓이게 된다.
isSator 플래그 변수:
boolean isSator = true;
이 변수는 현재까지 사토르 마방진 조건을 만족하는지 여부를 나타낸다. 
일단은 "YES"라고 가정하고 시작한다.
사토르 마방진 조건 확인:
for(int i = 0; i < N; i++) 와 for(int j = 0; j < N; j++) 두 개의 중첩 반복문을 사용하여 grid 배열의 모든 (i, j) 위치에 대해 검사한다.
if(grid[i][j] != grid[j][i]): 현재 위치 (i, j)의 문자와 대칭 위치 (j, i)의 문자를 비교한다.
만약 두 문자가 다르면, 사토르 마방진의 조건을 만족하지 못하므로 isSator를 false로 바꾸고 break 문을 이용해 안쪽 반복문(j 루프)을 즉시 종료한다.
if(!isSator) { break; }: 안쪽 루프가 종료된 후 isSator가 false라면, 이미 마방진이 아님이 확정되었으므로 더 이상 검사할 필요가 없다. 
따라서 바깥 반복문(i 루프)도 break로 종료시킨다.
이 최적화를 통해 불필요한 비교를 줄일 수 있다.
결과 출력:
모든 비교가 끝난 후, isSator 값이 true이면 "YES"를 출력하고, false이면 "NO"를 출력한다.
BufferedReader 닫기:
br.close(); 더 이상 BufferedReader를 사용하지 않으므로 자원 반환을 위해 닫아준다.

코드로 구현

package baekjoon.baekjoon_30;

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

// 백준 20112번 문제
public class Main1197 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 1. N 값 읽기
        int N = Integer.parseInt(br.readLine());

        // 2. N x N 크기의 문자를 저장할 2차원 배열 선언
        char[][] grid = new char[N][N];

        // 3. N개의 줄에 걸쳐 단어들을 읽고 2차원 배열에 저장
        for(int i = 0; i < N; i++) {
            String line = br.readLine(); // 한 줄의 단어를 읽어옴
            for(int j = 0; j < N; j++) {
                grid[i][j] = line.charAt(j); // 각 문자를 배열에 저장
            }
        }

        // 4. 사토르 마방진 여부를 판단할 변수 (초기값은 YES라고 가정)
        boolean isSator = true;

        // 5. 대칭 조건(grid[i][j] == grid[j][i]) 확인
        // 모든 (i, j) 쌍에 대해 검사
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                // 만약 grid[i][j]와 grid[j][i]가 다르면 사토르 마방진이 아님
                if(grid[i][j] != grid[j][i]) {
                    isSator = false; // 플래그를 false로 변경
                    break;           // 안쪽 반복문 탈출
                }
            }
            if(!isSator) { // isSator가 false라면 이미 답이 나온 것이므로 바깥 반복문도 탈출
                break;
            }
        }

        // 6. 결과 출력
        if(isSator) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }

        br.close(); // BufferedReader 닫기
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글