[이코테] 구현 - 뱀 with 파이썬

JIN KANG·2022년 10월 11일
0

이코테

목록 보기
11/29
post-thumbnail

1. 문제

  • 백준 3190과 같은 문제
    - 링크 : https://www.acmicpc.net/problem/3190

  • 사과의 위치와 뱀의 이동경로가 주어질 때, 이 게임이 몇 초에 끝나는지 계산하라.

  • 조건
    - 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1, 처음에 오른쪽을 향한다.
    - 보드의 크기 N
    - 사과의 개수 K
    - 사과의 위치 ( 행, 열 ) , 위치는 모두 다르며, 1행1열 맨 위 맨 좌측에는 사과가 없다.
    - 뱀의 방향 변환 횟수 L
    - 정수 X, 문자 C : X초가 끝난 뒤에 왼쪽 L 또는 오른쪽 D로 90도 방향을 회전시킨다. X는 10000 이하의 양의 정수, 방향 전환 정보는 X가 증가하는 순으로 주어진다.

  • 게임이 몇 초에 끝나는지 출력하라.

입출력 예시

2. 아이디어

  • 못풀어서, 문제의 지시를 차근차근 따라한다라는 답안을 리뷰해봤다.
  • 뱀이 벽을 부딪히는지, 자신에게 부딪히는지 확인하면서, 맵을 지나간다, 사과를 먹는다, 회전을 한다를 구현해야한다.

3. 예제코드

## 데이터 입력 (판 그리기 , 사과 입력하기 )
# 보드 0 으로 이루어지고 
# 사과는 1로 두고 , 뱀은 2로 둔다. 
n = int(input())   # 보드크기
k = int(input())   # 사과의 수
data = [[0]* (n+1) for _ in range(n+1)]   # 기준이 1,1 이니까

for _ in range(k):
    a, b = map(int, input().split())
    data[a][b] = 1   # 맵에 사과 입력 

# 방향정보 입력 
info = []  # 방향 전환정보
l = int(input())
for _ in range(l):
    x, c = input().split()
    info.append((int(x), c))
    
# 방향 회전 함수 , 시계 방향으로 , 인덱스가 + 되면 동쪽으로 회전, -면 서쪽으로 회전
dx = [0, 1, 0, -1]  # 처음 위치 동쪽, 동 남 서 북 순서 # dx가 y축이다. 
dy = [1, 0, -1, 0]

def turn(direction, c):  # 현재방향과, 방향 전환 문자 가 매개변수로 들어온다.
    if c == "L":     # 왼쪽 회전 , 반시계 방향 90도
        direction = (direction - 1)%4  # 나머지를 구하면, 무슨 값이든 0~3까지
    else:            # 오른쪽 회전, 시계 방향 90도
        direction = (direction + 1)%4  # direction은 dx, dy의 인덱스 역할
    return direction
    
## 시뮬레이션 함수 
def simulate():
    # 변수, 초기화 
    x, y = 1,1  # 시작점 , 캐릭터, x, y 
    data[x][y] = 2   # 뱀의 존재를 맵에 표시
    direction = 0    # 처음 동쪽 방향을 0을 한다. direction은 인덱스니까
    time = 0         # 처음 시간 초기화
    index = 0        # 다음 회전 정보 , info의 인덱스로 사용한다. 차례차례 회전진행
    q = [(x,y)]      # 뱀, 큐 자료구조로 , 지나가면 map을 0으로 바꿔주기 위해서
    
    # 시뮬레이션 본격 시작 
    while True: 
        nx = x + dx[direction]    # 이동 준비, 다음 갈 좌표 
        ny = y + dy[direction]
        
        if 1<= nx and nx <= n and 1 <=ny and ny <=n and data[nx][ny] !=2:
            if data[nx][ny] == 0:   # 사과 없으면
                data[nx][ny] = 2    # 맵에 이동 표시
                q.append((nx,ny))   # 뱀 머리 업데이트 
                px, py = q.pop(0)   # 꼬리 떼낸다. 
                data[px][py] = 0    # 꼬리 맵에서 지워준다. 
                
            if data[nx][ny] == 1:   # 사과가 있으면
                data[nx][ny] = 2    # 맵에 이동 표시
                q.append((nx,ny))   # 머리 업데이트하고, 꼬리는 안뗀다. 
                
        else : # 다음이 부딪힌걸 확인한거고, 실제 이동할때, 시간 올리면서 종료
            time += 1  
            break   
            
        x, y = nx, ny  # 뱀 이동, 시간도 같이 흘러간다. 
        time += 1 
        
        if index < l and info[index][0] == time :  # 회전할 시간인지 확인
            direction = turn(direction, info[index][1])
            index += 1    # 받은 회전 중 몇번 했는지 
    return time 

print(simulate())

배운점

  • 뱀이동 시키는 법, 2차원 리스트상에서 캐릭터를 회전시키는 방법

참조

  • 이것이 취업을 위한 코딩테스트다. with 파이썬
profile
성장하는 데이터 분석가

0개의 댓글