본문 바로가기

잡/공부일기

7/11 공부

 

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

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

백준 3190 문제를 푸는데 시물레이션 문제라 문제 요구 사항만 그대로 구현하면 됐으나

구현 능력이 부족하여  제 시간안에 해결하지 못하였다. 

 

NxN board를 만들 때 나는 index를 0부터 시작해서  N-1로 만드는데 나동빈님 같은 경우는 직관적이게 1~N으로 

만드는 거 같다. 앞으로도 의식적으로 이 방식으로 만들려고 노력해야겠다.

 

def turn(direction, c):
    if c == "L":
        direction = (direction -1) % 4
    else:
        direction = (direction+1) % 4
    return direction

방향을 전환하는 함수이다 여기서  파이썬은 음수를 나누기 연산을 할 때  

A % B (A<0, B>0) A가 양수가 될 때까지 B를 더해주고 나머지를 구한다는 것을 알게 되었다

#처음에는 오른쪽으로 보고 있었으니 (동, 남, 서, 북)
dx = [0, 1, 0, -1]
dy = [1, 0, -1 ,0]

원래 같으면 dx,dy 를 동서남북 순으로 두겠지만 이 문제같은 경우는 90도 회전 수를 기준으로 배열해 놓았다

 

전체코드

더보기
n = int(input())
k = int(input())
data = [[0]*(n+1) for _ in range(n+1)] #맵정보
info = [] #방향 회전 정보

#맵 정보(사과 있는 곳은 1로 표시))
for _ in range(k):
    a,b = map(int, input().split())
    data[a][b] = 1

#방향 회전 정보 입력
l = int(input())
for _ in range(l):
    x,c = input().split()
    info.append((int(x),c))

#처음에는 오른쪽으로 보고 있었으니 (동, 남, 서, 북)
dx = [0, 1, 0, -1]
dy = [1, 0, -1 ,0]

def turn(direction, c):
    if c == "L":
        direction = (direction -1) % 4
    else:
        direction = (direction+1) % 4
    return direction

def simulate():
    x, y = 1,1 #뱀의 머리 위치
    data[x][y] = 2 #뱀이 존재하는 위치는 2로 표시
    direction = 0 #처음에는 동쪽을 보고 있음
    time = 0 #시작한 뒤에 지난 '초' 시간
    index = 0 #다음에 회전할 정보
    q = [(x,y)] #뱀이 차지하고 있는 위치 정보(꼬리가 앞쪽)
    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 time == info[index][0]: 
            #회전할시간
            direction = turn(direction,info[index][1])
            index +=1
    return time

 

머릿 속의 구현과 일치했지만 코드 짜는 실력이 부족해서 구현하지 못했다.

코드를 안보고 짤 수 있을 때까지 이 문제는 여러번 풀어 봐야 할 것 같다.

반응형

' > 공부일기' 카테고리의 다른 글

8/2 공부  (0) 2021.08.02
7/26 공부  (0) 2021.07.26
DFS&BFS 정리  (0) 2021.07.20
7/20 공부  (0) 2021.07.20
7/19 공부  (0) 2021.07.19