이것이 취업을 위한 코딩 테스트다. 구현 [게임 개발]

GOSHK·2022년 1월 26일
0
post-custom-banner

이것이 취업을 위한 코딩 테스트다. 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]);
}
}
  • 각 방향에 맞는 좌표를 가진 2차 배열을 생성한다.
  • 입력받은 가로, 세로 사이즈에 맞는 맵을 생성해준다.
  • 맵의 정보를 입력받고 맵을 초기화 해준다.
map[A][B] = 1; //맨 처음 위치는 항상 육지이다.
int answer = 1; //그렇기 때문에 1로 시작
int turnCnt = 0;
  • 처음 캐릭터의 위치는 항상 육지이다. 따라서 맵의 처음 입력받은 좌표(A,B) 를 1로 초기화하고, answer(count) 를 +1 해준다.
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;
    }
}
  • 반복문을 돌린다.
  • 방향 회전은 반시계 방향이기 때문에 -1을 해주며 방향을 돌린다. 이 때, -1이 될 수 있으니 -1이 될 경우 3이 되게 조정해준다.
  • 임시 A, B 변수를 지정하고, 현재 좌표 와 바라보고 있는 방향에 맞는 좌표 를 더해서 temp 값에 각각 담아둔다.
  • 만일 맵에서 해당 좌표의 값이 0이라면, 육지라는 뜻이다. 그렇기 때문에 전진을 할 수 있으므로, 전진을 하여 0 에서 1로 초기화 해주고, 실제 캐릭터의 좌표인 A, B 의 값을 temp 값으로 바꿔준다. 그리고 answer(count) 를 1 더해주고, 방향회전 횟수를 0으로 초기화해준다. 이 후의 로직은 볼 필요가 없기 때문에, continue 로 시간을 낭비하지 않게 스킵한다.
  • 만일 해당 좌표가 1이라면, 바다 또는 가본 칸이기 때문에 방향을 돌려준다.
  • 만일 방향회전 횟수가 4가 될 경우 모든 방향을 돌아봤다는 뜻이므로, 메뉴얼 3번의 지시에 따라 해당 방향을 바라보며 뒤로 한칸 이동시킨다.
  • 만일 뒤로 한칸 이동한 좌표가 바다칸(1) 이라면 움직임을 멈춰야 하므로, break 를 통해 반복문을 탈출한다.
  • 바다가 아니라면, 캐릭터의 실제 좌표를 temp 값으로 바꿔준다.

문제 해설 & 느낀점

해설에서는 static 을 활용해서 전역 변수로 좌표들을 활용하고, 방향회전을 메서드를 정의하여 문제를 해결했다. 메서드나 이런 것들을 좀 더 활용해서 객체지향적으로 접근하는 능력도 길러야겠다.

그리고 이러한 문제유형은 그냥 일단 좌표를 배열로 짜놓는 것이 좋은 것 같다. 처음 캐릭터의 위치를 반복문에 넣고 1로 바꾸려고 하니까 잘 되지 않았다. 나중에 처음 캐릭터의 위치는 무조건 육지라는 것을 보게 되었고, 결국 처음 캐릭터의 좌표를 1로 바꾸고 answer 를 1인 상태에서 시작하니 훨씬 수월했다. 하지만 이러한 문제는 문제 유형처럼 시뮬레이션, 즉 머리로 if if 를 해야하기 때문에 머리가 아프다.

post-custom-banner

0개의 댓글