[시뮬레이션] 대각선 경계 좌표 구하기 (BOJ 17779 게리맨더링 2)
(1,1)부터 시작하는 격자가 주어지고, 대각선 경계를 가지는 마름모꼴 영역이 주어진다.
이 영역만 색칠하고 싶을 때, 어떻게 조건문을 짜야 대각선 경계를 처리할 수 있을까?
판에 대각선을 그려가며 패턴을 파악해보자.
우상향하는 대각선에 있는 칸들은 좌표합 x + y이 일정하다는 특징을 가진다.
우하향하는 대각선에 있는 칸들은 좌표차 y - x이 일정하다.
BOJ 17779 게리맨더링 2 문제는 기준점 (x_s, y_s)에서 d1, d2만큼 대각선으로 떨어진 지점을 잡고 마름모를 그린다.
위에서 파악한 대각선 경계 특징을 활용하여, 마름모 영역을 다음과 같은 조건문으로 잡아낼 수 있다.
int diag1 = x_s + y_s, diag2 = y_s - x_s;
// x, y는 각각 [1, N] 범위 내 수; 2중 For문으로 iterate (생략)
if ((diag1 <= x + y && x + y <= diag1 + 2*d2)
&& (diag2 - 2*d1 <= y - x && y - x <= diag2)){
// 구역 5 (마름모 꼴 구역) 처리
}
처음엔 이걸 몰라서, 시작점에서 d1, d2 떨어진 지점까지 경계선을 하나씩 찍고,
각 행마다 경계선이 시작해서 끝날 때까지 칸들을 색칠해서 마름모를 말 그대로 '색칠'함.
하드 코딩이기에 코드도 길어지고 시간도 오래 걸리니, 이 방법 잘 숙지해두기!
(15Apr21 수정) 각 라인에 있는 원소의 개수가 필요하다면?
좌표합 x + y 혹은 y - x 와 원소의 개수 간의 관계를 이끌어내기는 힘들어보인다.
이럴 때는 직접 수를 나열해서 패턴을 찾아보자.
대각선 ↗ 의 좌표합 x + y => 원소 개수
1 + 1 => 1
1 + 2 => 2
1 + 3 => 3
...
1 + N => N
2 + N => N-1
3 + N => N-2
...
N-1 + N => 2
N + N => 1
패턴을 보고 식을 끼워맞춰보자.
좌표합을 K라고 하자.
K <= N+1 일때, 원소 개수 = K-1
K > N+1 일때, 원소 개수 = N - (K - N - 1) = 2*N - K + 1
대각선 ↘ 의 좌표합 y - x => 원소 개수
N - 1 => 1
N - 2 => 2
N - 3 => 3
...
N - N => N
(N-1) - N => N-1
(N-2) - N => N-2
...
2 - N => 2
1 - N => 1
K >= 0 일때, 원소 개수 = - K
K < 0 일때, 원소 개수 = K + N
'<PS> > [노트]' 카테고리의 다른 글
[구현 팁] Parity bit을 이용한 짝수 홀수 구별법 (0) | 2021.04.15 |
---|---|
[시뮬레이션] 코드와 데이터 분리 / Indexing 테이블 (BOJ 큐빙, 미세먼지 안녕!) (0) | 2021.03.25 |
[구현] Struct/Class 활용 + 헤더 분리 연습 (BOJ 16235 나무 재테크) (0) | 2021.03.24 |
[시뮬레이션] N진수 암호화를 사용한 방향 조합 + 행렬 회전 (0) | 2021.02.28 |
[수학] 직관적으로 안와닿는 수학문제 (BOJ 1188 음식 평론가) (0) | 2021.01.17 |