백준 교수님 저는 취업할래요

KIMYEONGJUN·2026년 4월 8일
post-thumbnail

문제

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

입력의 첫 번째 줄에 자연수 N(7 ≤ N ≤ 1,000) 이 주어진다.
두 번째 줄부터 N개의 각 줄에 0, 1, 2, 5 중 하나의 숫자가 공백으로 구분되어 N개씩 주어진다.
N개의 줄 중 R번째 줄의 C번째 숫자가 d라는 것은 다음과 같은 의미를 가진다:
d = 0: 책상 (R, C)는 빈 자리이다.
d = 1: 책상 (R, C)는 성규가 아닌 학생이 앉아있다.
d = 2: 책상 (R, C)는 성규가 앉아있다.
d = 5: 책상 (R, C)는 교수님이 앉아있다.
성규와 교수님은 겹치지 않으며, 각각 정확히 한 자리에만 앉아있다.

첫 번째 줄에 성규가 교수님에게서 도망칠 수 있으면 1, 그렇지 못하면 0을 출력한다.

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

먼저 강의실 크기 N을 입력받고, 각 책상 자리를 2차원 배열 room에 저장한다.
동시에 성규(2)와 교수님(5)의 위치를 기록한다.
두 사람의 유클리드 거리를 구해 5 이상인지 확인한다. 
이 조건에 미달하면 바로 0 출력해 도망 불가능하다고 판단한다.
거리가 5 이상일 경우:
두 사람이 같은 행에 있으면 두 점 사이에 있는 학생(1)의 수를 세고,
같은 열에 있으면 두 점 사이 해당 열의 학생 수를 세며,
다르면 두 점으로 이루어진 직사각형 범위 내의 학생 수를 센다.
학생이 3명 이상이면 '도망 가능(1)' 출력, 아니면 '불가능(0)' 출력한다.

코드로 구현

package baekjoon.baekjoon_34;

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

// 백준 18221번 문제
public class Main1351 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        int[][] room = new int[N][N];
        int rProf = -1, cProf = -1;
        int rSung = -1, cSung = -1;

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                room[i][j] = Integer.parseInt(st.nextToken());
                if (room[i][j] == 5) {
                    rProf = i;
                    cProf = j;
                } else if (room[i][j] == 2) {
                    rSung = i;
                    cSung = j;
                }
            }
        }

        // 거리 계산
        double dist = Math.sqrt((rProf - rSung)*(rProf - rSung) + (cProf - cSung)*(cProf - cSung));

        // 조건 1: 거리 5 이상이어야 함
        if (dist < 5) {
            System.out.println(0);
            return;
        }

        int count = 0;

        // 교수와 성규가 같은 행
        if (rProf == rSung) {
            int row = rProf;
            int start = Math.min(cProf, cSung) + 1;
            int end = Math.max(cProf, cSung);
            for (int col = start; col < end; col++) {
                if (room[row][col] == 1)
                    count++;
            }
        }
        // 교수와 성규가 같은 열
        else if (cProf == cSung) {
            int col = cProf;
            int start = Math.min(rProf, rSung)+1;
            int end = Math.max(rProf, rSung);
            for (int row = start; row < end; row++) {
                if (room[row][col] == 1)
                    count++;
            }
        }
        // 교수와 성규가 행, 열 모두 다르다면 직사각형 내 학생 카운트
        else {
            int rStart = Math.min(rProf, rSung);
            int rEnd = Math.max(rProf, rSung);
            int cStart = Math.min(cProf, cSung);
            int cEnd = Math.max(cProf, cSung);
            for (int i = rStart; i <= rEnd; i++) {
                for (int j = cStart; j <= cEnd; j++) {
                    if (room[i][j] == 1)
                        count++;
                }
            }
        }

        if (count >= 3)
            System.out.println(1);
        else
            System.out.println(0);

        br.close();
    }
}

마무리

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

profile
Junior backend developer

0개의 댓글