문제 : https://www.acmicpc.net/problem/3190

 

3190번: 뱀

문제  'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따

www.acmicpc.net

문제 요약 : 게임의 끝나는 시간을 계산하시오

입력 출력

2 ≤ N(크기) ≤ 100

0 ≤ K(사과) ≤ 100

K줄의 사과 좌표

1 ≤ L(회전) ≤ 100

L줄의 시간과 회전방향(D, L)

게임이 끝나는 시간

 

JAVA

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
16349741 cbkpar 3190 맞았습니다!! 13608KB 84ms Java 1749B
import java.io.*;

public class Main {

	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n,k,l,i;
		String str = "";
		
        //입력 받는 부분
		n = Integer.parseInt(br.readLine());
		int[][] board = new int[n][n];
		board[0][0]=2;
		k = Integer.parseInt(br.readLine());
		int[][] tail = new int[k+2][2];
		int tail_length = 1;
		for(i=0;i<k;i++) {
			str = br.readLine();
			String[] arr = str.split(" ");
			board[Integer.parseInt(arr[0])-1][Integer.parseInt(arr[1])-1]=1;
			
		}
		l = Integer.parseInt(br.readLine());
		int[][] move = new int[l+1][2];
		for(i=0;i<l;i++) {
			str = br.readLine();
			String[] arr = str.split(" ");
			move[i][0] = Integer.parseInt(arr[0]);
			if(arr[1].charAt(0)=='D') {
				move[i][1] = 1; // 오른쪽
			}else {
				move[i][1] = 3; // 왼쪽
			}
		}
		move[l][0]=0; // index에러 방지를 위해 마지막 움직임 추가
		move[l][1]=0;
		int[] dy = {-1,0,1,0}; // 위 오른쪽 아래 왼쪽 순서
		int[] dx = {0,1,0,-1};
		int moven = 0; // 회전방향순서
		int direction = 1; // 방향
		int time = 0; // 게임 진행 시간
		int nx = 0; // 현재 x
		int ny = 0; // 현재 y
		while(true) {
			time++; //시간을 1증가
			nx+=dx[direction]; // 현재 x좌표 갱신
			ny+=dy[direction]; // 현재 y좌표 갱신
			if(nx<0||nx>=n) break; // 벽에 부딪히면 종료
			if(ny<0||ny>=n) break;
			if(board[ny][nx]==2) break; // 자기자신에 부딪히면 종료
			if(board[ny][nx]==1) { // 사과먹을 경우
            //꼬리 뒤로 보내는 부분
				for(i=tail_length-1;i>=0;i--) {
					tail[i+1][0] = tail[i][0];
					tail[i+1][1] = tail[i][1];
				}
				tail[0][0] = ny;
				tail[0][1] = nx;
				tail_length++; // 꼬리길이 증가
				board[ny][nx]=2;
			}
			if(board[ny][nx]==0) {
				board[ny][nx]=2;
                //꼬리 뒤로 보내는 부분
				for(i=tail_length-1;i>=0;i--) {
					tail[i+1][0] = tail[i][0];
					tail[i+1][1] = tail[i][1];
				}
				tail[0][0]=ny;
				tail[0][1]=nx;
				board[tail[tail_length][0]][tail[tail_length][1]]=0;
			}
			if(move[moven][0]==time) { //시간과 방향움직이는 시간이 같다면
				direction = (direction+move[moven++][1])%4; // 왼쪽과 오른쪽으로 꺾음
			}
		}
		System.out.println(time); // 게임시간 출력
	}
}



+ Recent posts