반응형
풀이
이 문제는 특별한 알고리즘을 적용하는 것이 중요하지는 않은 구현문제입니다!!
특히 블록에 부딪히거나 벽에 부딪힌 경우의 방향 전환과 웜홀에서 순간 이동에 주의해야합니다!!!
저는 위의 그림처럼 충돌 전 방향과 충돌 후 방향이 어떻게 변하는지를 미리 생각해두고 문제를 해결했습니다.
또한 웜홀의 경우는 ArrayList배열을 만들어 같은 숫자에 해당하는 위치들을 해당 인덱스에 저장해 두고 사용했습니다.
그런뒤 map상에서 빈칸 즉 0인 위치들에서 각각의 4가지 방향에 대해 모두 출발해 보며 최대 점수를 찾아내면 되는 문제입니다.
import java.util.Scanner;
import java.util.*;
public class Solution {
static int[][] dirChange = {{0, 0, 0, 0}, {1, 2, 3, 0}, {1, 3, 0 ,2}, {3, 0, 1, 2}, {2, 0, 3, 1}, {1, 0, 3, 2}};
static int[] moveR = {0, 0, -1, 1};
static int[] moveC = {1, -1, 0, 0};
static int[][] map;
static ArrayList<Pos>[] wormhole;
static int N;
static int answer;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for(int tc = 1; tc<= T; tc++) {
N = sc.nextInt();
map = new int[N][N];
wormhole = new ArrayList[5];
for(int i=0; i<5; i++) {
wormhole[i] = new ArrayList<>();
}
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
map[i][j] = sc.nextInt();
if(map[i][j] >= 6) {
wormhole[map[i][j]-6].add(new Pos(i, j));
}
}
}
answer = 0;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(map[i][j]!=0)
continue;
for(int dir=0; dir<4; dir++) {
int score = check(i, j, dir);
if(score > answer)
answer = score;
}
}
}
System.out.println("#"+tc+" "+answer);
}
}
static int check(int r, int c, int dir) {
int score = 0;
int nowR = r;
int nowC = c;
int move = 0;
while(true) {
//제자리로
if(nowR == r && nowC == c && move !=0)
break;
//블랙홀
if(map[nowR][nowC] == -1)
break;
nowR = nowR + moveR[dir];
nowC = nowC + moveC[dir];
move++;
//벽에 부딪힘
if(nowR<0 || nowR>=N || nowC<0 || nowC>=N) {
nowR = nowR - moveR[dir];
nowC = nowC - moveC[dir];
if(dir == 0)
dir = 1;
else if(dir == 1)
dir = 0;
else if(dir == 2)
dir = 3;
else if(dir == 3)
dir = 2;
score++;
}
//블록에 부딪힘
if(map[nowR][nowC] >= 1 && map[nowR][nowC] <=5) {
int block = map[nowR][nowC];
dir = dirChange[block][dir];
score++;
continue;
}
//웜홀
if(map[nowR][nowC] > 5) {
int block = map[nowR][nowC];
int r1 = wormhole[block-6].get(0).r;
int c1 = wormhole[block-6].get(0).c;
int r2 = wormhole[block-6].get(1).r;
int c2 = wormhole[block-6].get(1).c;
if(nowR == r1 && nowC == c1) {
nowR = r2;
nowC = c2;
}
else {
nowR = r1;
nowC = c1;
}
}
}
return score;
}
static class Pos {
int r, c;
Pos(int r, int c){
this.r = r;
this.c = c;
}
}
}
728x90
반응형
'알고리즘 > PS - SWEA' 카테고리의 다른 글
[SWEA 5644 - Java] 무선 충전 (0) | 2021.10.18 |
---|---|
[SWEA 4012 - Java] 요리사 (0) | 2021.10.15 |
[SWEA 1953 - Java] 탈주범 검거 (0) | 2021.10.14 |
[SWEA 1952 - Java] 수영장 (0) | 2021.10.14 |
[SWEA 1949 - Java] 등산로 조성 (0) | 2021.10.13 |