https://swexpertacademy.com/main/code/problem/problemDetail.do
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
접근 방법
8 방향으로 백트래킹을 했다.
내 돌을 놓을 때마다 그 수의 8 방향에 상대 돌이 있는지 마지막은 내 돌인지 확인해야 했다.
내가 이해한 바로는 한 곳 이상은 내 돌과 내 돌 사이에 빈틈없이 상대 돌이 있다는 거였다.
그러므로 도중 리턴을 해야 하는 경우는
(1) 위치 인덱스가 초과한 경우
(2) 해당 위치가 빈 경우
(3) 해당 위치가 내 돌인 경우 이다. 3번의 경우 check(ck)를 유효화했다. 이후 지나온 자리를 내 돌로 교체해 준다.
해당 위치가 상대 돌인 경우에는 이후에도 여러 개 존재할 수 있으므로 check(ck)를 무효화하고 재귀했다.
소스 코드
import java.util.*;
import java.io.*;
class Solution {
static int N;
static int[] cnt;
static int[][] map;
static int ck;
static int[] dx = {1, 1, 0, -1, -1, -1, 0, 1};
static int[] dy = {0, 1, 1, 1, 0, -1, -1, -1};
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int tc=1; tc<=T; tc++) {
ck = 0;
cnt = new int[2];
Arrays.fill(cnt, 2);
N = sc.nextInt();
map = new int[N][N];
map[N/2-1][N/2-1] = 2; // w
map[N/2-1][N/2] = 1; // b
map[N/2][N/2-1] = 1; // b
map[N/2][N/2] = 2; // w
int M = sc.nextInt();
for(int i=0; i<M; i++) {
int x = sc.nextInt()-1;
int y = sc.nextInt()-1;
int d = sc.nextInt();
map[x][y] = d;
cnt[d-1] += 1;
for(int j=0; j<8; j++) {
back(x + dx[j], y + dy[j], dx[j], dy[j], d);
}
}
System.out.println("#" + tc + " " + cnt[0] + " " + cnt[1]);
}
}
static void back(int x, int y, int xx, int yy, int dd) {
if (N-1 < x || N-1 < y || x < 0 || y < 0)
return;
if (map[x][y] == 0 || (map[x][y] == dd && map[x-xx][y-yy] == map[x][y]))
return;
if (map[x][y] == dd) {
ck = 1;
return;
}
if (map[x][y] != dd) {
ck = 0;
back(x+xx, y+yy, xx, yy, dd);
if (ck == 1) {
cnt[map[x][y]-1] -= 1;
map[x][y] = dd;
cnt[dd-1] += 1;
}
}
}
}
'코테 > 자바' 카테고리의 다른 글
[SWEA] 3750. Digit sum (0) | 2023.05.18 |
---|---|
[SWEA] 3307. 최장 증가 부분 수열 (0) | 2023.05.18 |
[SWEA] 1226. 미로1 (0) | 2023.05.18 |
[SWEA] 2817. 부분 수열의 합 (0) | 2023.05.18 |
[SWEA] 1244. 최대 상금 (0) | 2023.05.18 |