알고리즘 연습

[ 삼성 SW 역량 테스트 A형 기출문제 ] 3190. 뱀 _ JAVA 문제풀이

코딩하는 너구리 2019. 10. 19. 22:43
반응형

문제

 

 

 

 

 

 

풀이

 

 

#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

 

 

반응형