[Baekjoon] 3190번: 뱀 (구현 Gold4) - Python

꼬마요리사레미·2023년 5월 31일

Algorithm

목록 보기
39/41

1. 문제


2. 풀이


코드
n = int(input())  # 보드의 크기
k = int(input())  # 사과의 개수
board = [[0] * (n+1) for _ in range(n+1)]  # 보드 초기화
for _ in range(k):
    row, col = map(int, input().split())
    board[row][col] = 1  # 사과의 위치

l = int(input())  # 방향 변환 정보 개수
info = [list(map(str, input().split())) for _ in range(l)]  # 방향 변환 정보 저장

dx = [0, -1, 0, 1]  # 동, 북, 서, 남
dy = [1, 0, -1, 0]


def change_direction(direction, change):
    if change == 'L':  # 왼쪽으로 회전
        direction = (direction-1) % 4
    if change == 'D':  # 오른쪽으로 회전
        direction = (direction+1) % 4
    return direction


def solution():
    cx, cy = 1, 1  # 뱀의 초기 위치
    snake = [(cx, cy)]  # 뱀의 위치 정보를 저장할 리스트
    board[cx][cy] = 2  # 뱀의 위치 표시
    direction = 0  # 초기 방향 (동쪽)
    elapsed_time = 0  # 경과 시간
    index = 0  # 방향 변환 정보 인덱스

    while True:
        nx, ny = cx + dx[direction], cy + dy[direction]  # 다음 위치 계산
        if 0 < nx < n and 0 < ny < n and board[nx][ny] != 2:  # 벽이나 몸에 부딪히지 않았다면
            if board[nx][ny] == 1:  # 사과가 있다면
                board[nx][ny] = 2  # 뱀의 위치 표시
                snake.append((nx, ny))  # 뱀의 위치 정보 추가
            else:
                board[nx][ny] = 2  # 뱀의 위치 표시
                snake.append((nx, ny))  # 뱀의 위치 정보 추가
                x, y = snake.pop(0)  # 꼬리 제거
                board[x][y] = 0  # 꼬리 위치 초기화
            cx, cy = nx, ny  # 뱀의 머리 위치 업데이트
            elapsed_time += 1  # 경과 시간 증가
        else:  # 벽이나 몸에 부딪혔다면 종료
            elapsed_time += 1  # 경과 시간 증가
            break

        if index < len(info) and elapsed_time == int(info[index][0]):  # 방향 변환 시간이 되면
            direction = change_direction(direction, info[index][1])  # 방향 변환
            index += 1  # 다음 방향 변환 정보로 이동

    return elapsed_time  # 경과 시간 반환


print(solution())
입력 및 출력
6
3
3 4
2 5
5 3
3
3 D
15 L
17 D

>> 9

3. 로직


  1. 입력값 받기: 입력값으로는 보드의 크기 n, 사과의 개수 k, 사과의 위치 정보 arr, 방향 변환 정보 개수 l, 방향 변환 정보 info가 주어진다.

  2. 보드 초기화: board라는 2차원 리스트를 만들어 보드를 초기화한다. 초기에는 사과가 없으므로 모든 위치의 값은 0으로 설정된다.

  3. 방향 변환 함수 만들기: change_direction 함수를 정의한다. 이 함수는 현재 방향(direction)과 방향 변환 정보(change)를 받아 새로운 방향을 결정한다. 왼쪽으로 회전할 때는 현재 방향에서 1을 뺀 뒤 4로 나눈 나머지를, 오른쪽으로 회전할 때는 현재 방향에서 1을 더한 뒤 4로 나눈 나머지를 반환한다.

  4. 게임 진행 함수 만들기: solution 함수를 정의한다. 이 함수는 게임을 진행하고 경과 시간을 반환한다.

  5. 초기 설정: 뱀의 초기 위치(cx, cy)를 (1, 1)로 설정하고, 뱀의 위치를 저장할 리스트인 snake에 초기 위치를 추가한다. 또한, 초기 위치에 뱀이 있음을 board에 표시한다.

  6. 게임 진행: 게임이 진행되는 동안 다음을 반복한다.

  • 다음 위치 계산: 현재 위치(cx, cy)에서 현재 방향(direction)에 따라 다음 위치(nx, ny)를 계산한다.
  • 벽 또는 몸에 부딪히지 않았을 경우:
  • 사과가 있는지 확인: 다음 위치에 사과가 있는지 확인한다.
  • 사과가 있을 경우:
    • 사과를 먹은 것으로 처리: board에서 다음 위치를 2로 설정하고, snake 리스트에 다음 위치를 추가한다.
  • 사과가 없을 경우:
    • 이동한 것으로 처리: board에서 다음 위치를 2로 설정하고, snake 리스트에 다음 위치를 추가한다.
    • 꼬리 제거: snake 리스트에서 첫 번째 위치를 제거하고, board에서 해당 위치를 0으로 설정한다.
  • 현재 위치 갱신: 현재 위치를 다음 위치로 업데이트한다.
  • 경과 시간 증가: 경과 시간을 1 증가시킨다.
  • 벽이나 몸에 부딪혔을 경우:
    • 게임 종료: 경과 시간을 반환하고 함수를 종료한다.
  1. 방향 변환 정보 처리: info 리스트를 차례대로 확인하면서 경과 시간이 해당 정보의 시간과 일치하는지 확인한다. 일치하는 경우에는 방향을 변경한다.

  2. 경과 시간 반환: 게임 종료 후 경과 시간을 반환한다.

  3. 결과 출력: solution 함수를 호출하여 경과 시간을 출력한다.

0개의 댓글