화분

[구름톤 챌린지 10일차] GameJam 본문

Study/CODINGTEST

[구름톤 챌린지 10일차] GameJam

ExcellEast 2023. 8. 26. 01:19

어느덧 10일차이다. 이번 문제에 대한 설명은 다음 링크 ( GameJam - 구름LEVEL (goorm.io) )

 

구름LEVEL

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

level.goorm.io

를 참조해주기 바란다.

 

문제를 풀기 위한 코드는 다음과 같다. 코드가 꽤 길다.

import java.io.*;
class Main {
	
	static int[] dy = {-1, 0, 1, 0};
	static int[] dx = {0, 1, 0, -1};
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
				
		String[] grStartRC = br.readLine().split(" ");//구르미 시작 좌표
		int goormR = Integer.parseInt(grStartRC[0]) - 1;
		int goormC = Integer.parseInt(grStartRC[1]) - 1;
		
		String[] plStartRC = br.readLine().split(" ");//플레이어 시작 좌표
		int plR = Integer.parseInt(plStartRC[0]) - 1;
		int plC = Integer.parseInt(plStartRC[1]) - 1;
		
		String[][] board = new String[N][N];
		for(int i = 0; i < N; i++){
			board[i] = br.readLine().split(" ");
		}
		
		int goormScore = 0;
		int playerScore = 0;
		boolean[][] grTraceBoard = new boolean[N][N];//폭탄 점수를 저장하는 2차원 행렬
		boolean[][] plTraceBoard = new boolean[N][N];
		
		goormScore = startGame(board, grTraceBoard, goormR, goormC, N);
		playerScore = startGame(board, plTraceBoard, plR, plC, N);
		
		if (goormScore > playerScore) {
    System.out.printf("goorm %d", goormScore);
		} else {
    System.out.printf("player %d", playerScore);
		}
	}
	
	public static int startGame(String[][] board, boolean[][] traceBoard, int r, int c, int N){
		int count = 1;
		traceBoard[r][c] = true;//시작 좌표를 방문한 흔적을 남기고 count를 체크한다.
		int whileCount = 0;
		int point_r = r;
		int point_c = c;
		while(true){
			String s = board[point_r][point_c];
			int len = s.length();
			int pointToMove = Integer.parseInt(s.substring(0, len - 1));//숫자부분이 두자리 수 이상을 가능성을 고려해서 작성.
			String directionToMove = s.substring(len - 1)
			int direc = 0;
			switch(directionToMove){
				case "U" : direc = 0; break;
				case "R" : direc = 1; break;
				case "D" : direc = 2; break;
				case "L" : direc = 3; break;
			}
			int moveUD = 0;
			int moveLR = 0;
			for(int countToMove = pointToMove; countToMove > 0; countToMove--){
				moveUD = dy[direc] + point_r;//움직일 위치의 좌표
				moveLR = dx[direc] + point_c;
				if(moveUD < 0)			//2차원 배열의 가장자리를 넘어설때
					moveUD = N - 1;
				else if(moveUD >= N)
					moveUD = 0;
				if(moveLR < 0)
					moveLR = N - 1;
				else if(moveLR >= N)
					moveLR = 0;
				
				if(!traceBoard[moveUD][moveLR]){//움직인 위치에 방문한 적이 없으면 true로 설정하고 count를 1 올린다.
					traceBoard[moveUD][moveLR] = true;
					count += 1;
					point_r = moveUD;
					point_c = moveLR;
				}
				else{
					return count; //방문한 적 있으면 점수를 return하고 함수 종료.
				}
				
			}
		}
	}
}

 

어려웠던 점

코드를 완성하는데엔 그렇게 오래 걸리지 않았지만 디버깅 하는데 많은 어려움을 겪었다. 테스트 케이스 2개도 성공적으로 통과하고 아무리 봐도 논리적 오류를 발견할 수 없었다.. 그렇지만 한참 오랫동안 살펴본 결과 문제를 발견했다. 좌표에 기록된 command를 파싱할때 오류를 범한 것이었다. 예시에 보면 한자리 수 숫자와 움직일 방향이 합쳐 있어서 단순하게 split("") 하였으나 두자리 이상일 경우를 고려하지 못했다. 이 부분을 옳게끔 코드를 다시 작성하니 모든 테스트 케이스를 통과하였다.

 

느낀점

문제 설명을 유의깊게 살펴봐야 하는 점을 다시금 상기시켰다.