이것이 취업을 위한 코딩 테스트다. with 파이썬 - 나동빈
public class GameDevelopment {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] firstLine = br.readLine().split(" ");
int N = Integer.parseInt(firstLine[0]); //맵의 세로 크기
int M = Integer.parseInt(firstLine[1]); //맵의 가로 크기
String[] secondLine = br.readLine().split(" ");
int A = Integer.parseInt(secondLine[0]); //북쪽으로부터 떨어진 칸의 개수 row
int B = Integer.parseInt(secondLine[1]); //서쪽으로부터 떨어진 칸의 개수 column
int d = Integer.parseInt(secondLine[2]); //방향 0 북 1 동 2 남 3 서
int[][] direction = new int[][]{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int[][] map = new int[N][M];
for(int i = 0; i < N; i++) {
String[] mapInfo = br.readLine().split(" ");
for(int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(mapInfo[j]);
}
}
map[A][B] = 1; //맨 처음 위치는 항상 육지이다.
int answer = 1; //그렇기 때문에 1로 시작
int turnCnt = 0;
while(true) {
d = d - 1 < 0 ? 3 : d - 1; //방향 회전
int tempA = 1;
int tempB = 1;
tempA = A + direction[d][0];
tempB = B + direction[d][1];
if(map[tempA][tempB] == 0) {
map[tempA][tempB] = 1;
A = tempA;
B = tempB;
answer++;
turnCnt = 0;
continue;
} else {
turnCnt++;
}
if(turnCnt == 4) {
tempA = A - direction[d][0];
tempB = B - direction[d][1];
if(map[tempA][tempB] == 1) {
break;
} else {
A = tempA;
B = tempB;
}
turnCnt = 0;
}
}
System.out.println(answer);
}
}
int[][] direction = new int[][]{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int[][] map = new int[N][M];
for(int i = 0; i < N; i++) {
String[] mapInfo = br.readLine().split(" ");
for(int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(mapInfo[j]);
}
}
map[A][B] = 1; //맨 처음 위치는 항상 육지이다.
int answer = 1; //그렇기 때문에 1로 시작
int turnCnt = 0;
while(true) {
d = d - 1 < 0 ? 3 : d - 1; //방향 회전
int tempA = 1;
int tempB = 1;
tempA = A + direction[d][0];
tempB = B + direction[d][1];
if(map[tempA][tempB] == 0) {
map[tempA][tempB] = 1;
A = tempA;
B = tempB;
answer++;
turnCnt = 0;
continue;
} else {
turnCnt++;
}
if(turnCnt == 4) {
tempA = A - direction[d][0];
tempB = B - direction[d][1];
if(map[tempA][tempB] == 1) {
break;
} else {
A = tempA;
B = tempB;
}
turnCnt = 0;
}
}
해설에서는 static 을 활용해서 전역 변수로 좌표들을 활용하고, 방향회전을 메서드를 정의하여 문제를 해결했다. 메서드나 이런 것들을 좀 더 활용해서 객체지향적으로 접근하는 능력도 길러야겠다.
그리고 이러한 문제유형은 그냥 일단 좌표를 배열로 짜놓는 것이 좋은 것 같다. 처음 캐릭터의 위치를 반복문에 넣고 1로 바꾸려고 하니까 잘 되지 않았다. 나중에 처음 캐릭터의 위치는 무조건 육지라는 것을 보게 되었고, 결국 처음 캐릭터의 좌표를 1로 바꾸고 answer 를 1인 상태에서 시작하니 훨씬 수월했다. 하지만 이러한 문제는 문제 유형처럼 시뮬레이션, 즉 머리로 if if 를 해야하기 때문에 머리가 아프다.