
내가 생각했을때 문제에서 원하는부분
입력의 첫 번째 줄에 자연수 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.