문제 배경
격자(그리드) 형태의 보드 위에서 특정한 “격자점(grid point)”을 중심으로 대각선이 수평·수직 방향에 45°로 기울어진 마름모(다이아몬드) 모양을 정의하고, 각 셀(cell)이 이 마름모에 완전 포함되는지, 일부만 겹치는지, 전혀 겹치지 않는지를 판정하는 문제.
Python
import sys
input = sys.stdin.readline
# 입력 예시
# 4
# 5 7 8 2
# 3 6 9 4
# 8 1 2 3
# 4 5 7 6
# 1 2 4
def mark_diamond(board, center, r):
n = len(board)
cx, cy = center
d = r / 2.0
# 결과 마스크 초기화
mask = [[0] * n for _ in range(n)]
for i in range(1, n + 1):
for j in range(1, n + 1): # 각 셀 (i, j)에 대해 (1<=i,j<=n)
# 이 셀의 네 꼭짓점(격자칸 좌표)
corners = [(i - 1, j - 1), (i - 1, j), (i, j - 1), (i, j)]
# 각 꼭짓점과 중심점 사이의 맨해튼 거리
dists = [abs(x - cx) + abs(y - cy) for x, y in corners]
if max(dists) <= d:
# 네 꼭짓점 모두 반경 이내 -> 완전 포함
mask[i - 1][j - 1] = 1
elif min(dists) <= d:
# 최소 하나의 꼭짓점만 반경이내 -> 일부 겹침
mask[i - 1][j - 1] = -1
# else: 기본값 0 -> 겹치지않음
return mask
n = int(input())
board = [list(map(int, input().split()))]
cx, cy, r = map(float, input().split())
mask = mark_diamond(board, (cx, cy), r)
for row in mask:
print(" ".join(str(x) for x in row))
Java
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// 1) 입력 읽기
int n = Integer.parseInt(br.readLine().trim());
int[][] board = new int[n][n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < n; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
st = new StringTokenizer(br.readLine());
// 중심 격자점 (1-based) 과 대각선 길이 r
double cx = Double.parseDouble(st.nextToken());
double cy = Double.parseDouble(st.nextToken());
double r = Double.parseDouble(st.nextToken());
double d = r / 2.0; // Manhattan 반경
int[][] mask = new int[n][n]; // 결과 마스킹
for (int i = 0; i <= n; i++) {
for (int j = 1; j <= n; j++) {
double minDist = Double.MAX_VALUE;
double maxDist = Double.MIN_VALUE;
// 네 꼭짓점 순회
int[][] corners = {
{i-1, j-1},
{i-1, j},
{i, j-1},
{i,j}
};
for (int[] p : corners) {
double dist = Math.abs(p[0] - cx) + Math.abs(p[1] - cy);
minDist = Math.min(minDist, dist);
maxDist = Math.max(maxDist, dist);
}
if (maxDist <= d) {
mask[i-1][j-1] = 1; // 완전 포함
} else if (minDist <= d) {
mask[i-1][j-1] = -1; // 일부 겹침
} else {
mask[i-1][j-1] = 0; // 비겹침
}
}
}
// 결과 출력
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(mask[i][j]);
if (j < n-1) sb.append(' ');
}
sb.append('\n');
}
System.out.print(sb);
}
}
'자료구조&알고리즘' 카테고리의 다른 글
[자료구조] B-Tree vs B+Tree: 왜 DB 인덱스는 B+Tree를 쓸까? (1) | 2025.07.08 |
---|---|
2025 답/해설 없는 최신 코테 풀이 도전 메모기록 - 3 (2) | 2025.05.14 |
[programmers] 붕대 감기 (Python 풀이) (0) | 2025.04.23 |
2025 답/해설 없는 최신 코테 풀이 도전 메모기록 (0) | 2025.02.08 |
[일간코테] 주사위 고르기 (Python, Java) (2) | 2024.11.15 |