[구름톤 챌린지 2주 차 학습 일기] 10일차 미션 문제 10. GameJam (java)
Problem Solving/goorm

[구름톤 챌린지 2주 차 학습 일기] 10일차 미션 문제 10. GameJam (java)

728x90

https://level.goorm.io/exam/195692/gamejam/quiz/1

 

구름LEVEL

난이도별 다양한 문제를 해결함으로써 SW 역량을 향상시킬 수 있습니다.

level.goorm.io


728x90

 

내 생각

문제 설명이 조금 미흡한 것 같다.

<command> 방향으로 <count>만큼 한 번에 이동하고 점수는 1점 오른다고 생각해서 예시 2가 왜 player 6이 답이 나오는지 한참 고민했다.

<count>만큼 이동하는 도중 지나치는 모든 칸에 대해 방문 기록 체크를 해야 하고, <count>가 3이면 점수도 3점이 올라간다.

만약 <count>가 3이라 3칸을 이동해야 해서 1칸을 이동하고 다음 2번째 칸을 이동하려 하는데 이미 방문한 칸이라면 점수 1만 얻고 게임은 끝난다.


import java.io.*;
import java.util.*;

class Main {
	
	static int N;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		// N 입력
		N = Integer.parseInt(br.readLine());
		
		// 구름이 시작 좌표 입력
		st = new StringTokenizer(br.readLine());
		int[] goorm = new int[2];
		goorm[0] = Integer.parseInt(st.nextToken()) - 1;
		goorm[1] = Integer.parseInt(st.nextToken()) - 1;
		
		// 플레이어 시작 좌표 입력
		st = new StringTokenizer(br.readLine());
		int[] player = new int[2];
		player[0] = Integer.parseInt(st.nextToken()) - 1;
		player[1] = Integer.parseInt(st.nextToken()) - 1;
		
		// 보드 입력
		int[][] count = new int[N][N];
		String[][] command = new String[N][N];
		for(int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0; j < N; j++) {
				String tmp = st.nextToken();
				count[i][j] = Integer.parseInt(tmp.substring(0, tmp.length() - 1));
				command[i][j] = tmp.substring(tmp.length() - 1, tmp.length());
			}
		}
		
		// 구름이 점수 구하기
		int score1 = 1;
		boolean[][] visited = new boolean[N][N];
		visited[goorm[0]][goorm[1]] = true;
	while1:	while(true) {
			int cnt = count[goorm[0]][goorm[1]];
			String cmd = command[goorm[0]][goorm[1]];
			for(int i = 0; i < cnt; i++) { // cmd 방향으로 움직일 수 있을만큼 이동
				move(goorm, cmd); // 한 칸 이동
				if(visited[goorm[0]][goorm[1]]) break while1; // 이미 방문했던 곳이라면 while문 탈출
				score1++; // 점수 올리기
				visited[goorm[0]][goorm[1]] = true; // 방문체크
			}
		}
		
		// 플레이어 점수 구하기
		int score2 = 1;
		visited = new boolean[N][N];
		visited[player[0]][player[1]] = true;
while1:		while(true) {
			int cnt = count[player[0]][player[1]];
			String cmd = command[player[0]][player[1]];
			for(int i = 0; i < cnt; i++) { // cmd 방향으로 움직일 수 있을만큼 이동
				move(player, cmd); // 한 칸 이동
				if(visited[player[0]][player[1]]) break while1; // 이미 방문했던 곳이라면 while문 탈출
				score2++; // 점수 올리기
				visited[player[0]][player[1]] = true; // 방문체크
			}
		}
		
		// 답 출력
		if(score1 > score2) System.out.println("goorm " + score1);
		else System.out.println("player " + score2);
	}
	
	private static void move(int[] p, String cmd) { // p를 cmd에 따라 한 칸씩 이동시키는 메소드
		
		if(cmd.equals("U")) { // 위
			p[0] = p[0] == 0 ? N - 1 : p[0] - 1;
		} else if(cmd.equals("D")) { // 아래
			p[0] = p[0] == N - 1 ? 0 : p[0] + 1;
		} else if(cmd.equals("R")) { // 오른쪽
			p[1] = p[1] == N - 1 ? 0 : p[1] + 1;
		} else { // 왼쪽
			p[1] = p[1] == 0 ? N - 1 : p[1] - 1;
		}
	}
}
728x90