Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 1005 #ACM craft #백준
- 코딩테스트
- 코드트리 챌린지
- @EntityGraph
- 완전탐색
- JPA
- 회의실 배정
- til
- 1931번
- 구름톤 챌린지
- eager
- 공부하기 싫어 #그래도 해야해
- 동적 계획법
- 금 채굴하기
- Today I Learned
- 구름톤 트레이닝
- 멀록 조명등
- 지연로딩
- IT 좀 아는 사람
- 최장 공통 부분수열
- 공부 기록
- 즉시로딩
- 구름톤
- 백준 #1010 #다리놓기
- 코딩테스트실력진단
- TagLibraryValidator
- spring
- 백준
- 코드트리
- 행복한 수열의 개수
Archives
- Today
- Total
화분
[구름톤 챌린지 10일차] GameJam 본문
어느덧 10일차이다. 이번 문제에 대한 설명은 다음 링크 ( GameJam - 구름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("") 하였으나 두자리 이상일 경우를 고려하지 못했다. 이 부분을 옳게끔 코드를 다시 작성하니 모든 테스트 케이스를 통과하였다.
느낀점
문제 설명을 유의깊게 살펴봐야 하는 점을 다시금 상기시켰다.
'Study > CODINGTEST' 카테고리의 다른 글
[구름톤 챌린지 12일차] 발전기 (0) | 2023.09.03 |
---|---|
[코드트리 챌린지] 사전 과정 (0) | 2023.08.30 |
[구름톤 챌린지 9일차]폭탄 구현하기(2) (0) | 2023.08.26 |
[구름톤 챌린지 4일차]완벽한 햄버거 만들기 (0) | 2023.08.20 |
[구름톤 챌린지 5일차] 이진수 정렬 (0) | 2023.08.19 |