문제
풀이
#1. 먼저 입력받는 Input( ) 부분입니다.
1. 출발한 지 X초가 지나 방향이 전환됩니다. 그 시간초와 방향 L 또는 D를 기록해둘 큐 pq를 만들었습니다.
( 시간초 , 방향 ) 을 Curve 객체로 묶어 pq에 저장해두었습니다.
2. 2차원 배열 map에 뱀의 몸체가 있는 부분을 map[i][j]에 1로, 사과가 있는 위치는 4로,
아무것도 없거나 사과를 먹고 지나간 자리, 또는 뱀이 지나간 자리는 0으로 기록해둘 수 있도록
map 배열을 사용했습니다.
Input( ) 에서는 사과의 위치를 입력받아 4 로 저장해주었습니다.
3. 기본 길이 ( length ) 는 1로 , 진행 시간초 ( = Point ) 는 0으로 초기화 해주었습니다.
처음 시작하는 ( 0, 0 ) 위치에는 뱀이 위치해있기 때문에 1로 초기화 해주었습니다.
#2. 다음으로 뱀이 이동을 진행하는 Snake 부분입니다.
1. 먼저 꼬리를 잘라줍니다. 이유는 바로 이전에 꼬리를 지워준 부분으로 뱀이 진행할 수 있어야 하기 때문에
꼬리 자르기를 제일 먼저 진행해주었습니다.
list.size( ) 가 length 보다 크다면 ==> 뱀의 길이보다 더 많이 list에 담겨 있다면
가장 이전에 넣어주었던 위치를 삭제해주었습니다. ( = list.remove(0) )
뱀이 있던 자리는 1로 표시하였기 때문에 다시 0으로 돌려주었습니다. --> map[ tail_i ][ tail_j ] = 0 ;
2. 다음으로는 방향전환 부분입니다.
진행하기 전에 현재의 시간초에서 방향전환이 일어난다면 방향을 바꾸어주어야 합니다.
맨 처음 선언할 때 방향을 결정하는 di[ ] 와 dj[ ]를 우, 하, 좌, 상 방향으로 설정해주었기 때문에
D를 만나면 방향 인덱스 d를 +1 해주고 % 4 연산을 해주었습니다. 이는 0 ~ 3 방향에서만 계속
바뀔 수 있도록 해주기 위함입니다.
방향을 인덱스 d를 빼줄 때에는 1을 빼준 뒤에 +4를 해주고 다시 % 4 연산을 진행합니다.
0보다 작은 값이 나오면 안되기 때문에 +4를 하여 이것도 0 ~ 3 방향에서만 계속 방향이
바뀔 수 있도록 해주기 위함입니다.
#3. 이제 진행시킵니다.
1. next_i와 next_j를 정해줍니다.
맵 안에 있고, 다음 방향으로 진행이 가능하다면 ( map[ next_i ][ next_j ] != 1 ) 이동시킵니다.
그런데 다음 위치가 4 값이라면 사과를 먹은 것이기 때문에 길이를 1 증가시켜주었습니다. ( length++ )
한 단계 더 진행하였기 때문에 Point값을 1 증가시켜주고 다음 이동을 진행시킵니다.
이 문제는 뱀의 이동을 진행시키기 전에
꼬리 자르기, 방향 설정, 이동 등 여러 행동들을 어떻게 진행할 것인지 순서를 잘 정하는 것이
제일 중요한 것 같습니다.
뱀의 진행 순서를 잘 생각해서 풀이를 진행한다면 코드는 어렵지 않게 작성할 수 있는 문제인 것 같습니다.
코드
출처
https://www.acmicpc.net/problem/3190
3190번: 뱀
문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따
www.acmicpc.net
'알고리즘 연습' 카테고리의 다른 글
[ 백준_BOJ ] 1476. 날짜계산 _ 문제풀이 JAVA (0) | 2019.10.23 |
---|---|
[ 백준_BOJ ] 2636. 치즈 _ 문제풀이 JAVA (0) | 2019.10.23 |
[ SWEA_D1 ] 2072. 홀수만 더하기 _ JAVA 문제풀이 (0) | 2019.10.17 |
[ SWEA_D1 ] 2056. 연월일 달력 _ JAVA 문제풀이 (0) | 2019.10.17 |
[ SWEA_D1 ] 2071. 평균값 구하기 _ JAVA 문제풀이 (0) | 2019.10.17 |