곰퓨타의 SW 이야기

[04-4 구현] 게임 개발 본문

TIL/이것이 코딩테스트다_파이썬 문제 (백준문제 外)

[04-4 구현] 게임 개발

곰퓨타 2021. 4. 15. 02:25

최근 보고 있는 책인  '이것이 코딩테스트다 with 파이썬 편_나동빈_한빛미디어' 에 있는 문제이다.

www.hanbit.co.kr/store/books/look.php?p_code=B8945183661

 

이것이 취업을 위한 코딩 테스트다 with 파이썬

IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년부터 2020년까지의 코딩 테스트와 알고리즘 대회의 기출문제를 엄선하여 수록하였다.

www.hanbit.co.kr

 

 

문제는 책 안에 있다!!

나는 이 문제에 접근하기 위해 아래와 같은 방법을 이용했다.

 

 

테스트 케이스는 하나밖에 없어서 정확히 맞았는지는 모르겠다..

n,m = map(int,input().split())
x,y,direction = map(int,input().split())

map_list = []
for i in range(n) :
    map_list.append(list(map(int,input().split())))

# 0 : 북, 1 : 동, 2: 남, 3 : 서
dx = [-1,0,1,0]
dy = [0,1,0,-1]
mark = [[0 for i in range(m)] for j in range(n)]
turn_count = 0
while True :
    mark[x][y] = 1
    # 왼쪽으로 회전
    direction -= 1
    if direction < 0 :
        direction = 3

    # 가보지 않은 칸이 있는 경우
    if map_list[x+dx[direction]][y+dy[direction]] == 0 and mark[x+dx[direction]][y+dy[direction]]==0 :
        x += dx[direction]
        y += dy[direction]
        turn_count = 0

    # 해당 방향으로 다 가본 경우
    else :
        turn_count += 1

    if turn_count == 4 :
        # 뒤로 갈 수 있는 경우
        if map_list[x+dx[direction-2]][y+dy[direction-2]] == 0 :
            x += dx[direction-2]
            y += dy[direction-2]
            turn_count = 0
        # 뒤로 갈 수 없는 경우
        else:
            break

count = 0
for i in range(n):
    count += mark[i].count(1)

print(count)

 

 

 

 

책에서는 몇 가지 팁을 제공해주었다.

1, 방향을 설정해서 이동하는 문제는 dx, dy라는 별도의 리스트를 만들어서 방향을 정하는 것이 효과적이다.

ex ) 북쪽을 바라보면 북쪽으로 이동하기 위해 x,y 좌표에 x += dx[0] , y += dy[0]을 수행하도록 한다. (-1,0)만큼 이동 

2. 2차원 리스트를 선언할 때에는 컴프리헨션으로 리스트를 초기화하는 것이 효율적이다.

 ex) array = [[0] * m for _ in range(n)]

 

책에서는 다음과 같은 풀이로 풀어냈다. 책은 함수로 정의하여 깔끔하게 풀어낸 것 같다.

n,m = map(int, input().split())

# 방문한 위치를 저장하기 위함
d = [[0]*m for _ in range(n)]
# 캐릭터의 x,y 좌표와 방향 입력받기
x,y,direction = map(int,input().split())
d[x][y] = 1 # 현재 좌표 방문 처리

# 전체 맵 정보 받기
array = []
for i in range(n) :
	array.append(list(map(int, input().split())))
    
# 동, 서, 남, 북 방향 정의 
dx = [-1, 0, 1, 0]
dy = [0,1,0,-1]

# 왼쪽으로 회전
def turn_left() :
	global direction
    direction -= 1
    if direction == -1 :
    	direction = 3

# 시뮬레이션 시작
count = 1
turn_time = 0
while True :
	# 왼쪽으로 회전
    turn_left()
    nx = x + dx[direction]
    dy = y + dy[direction]
    # 회전한 이후 정면에 가보지 않은 칸이 존재하는 경우 이동
    if d[nx][ny] == 0 and array[nx][ny] == 0:
    	d[nx][ny] = 1
        x = nx
        y = ny
        count += 1
        turn_time = 0
        continue
    # 회전한 이후 정면에 가보지 않은 칸이 없거나 바다인 경우
    else :
    	turn_time += 1
    
    # 네 방향 모두 갈 수 없는 경우
    if turn_time == 4 :
    	nx = x - dx[direction]
        ny = y - dy[direction]
        # 뒤로 갈 수 있다면 이동하기
        if array[nx][ny] == 0:
        	x = nx
           	y = ny
        # 뒤가 바다로 막힌 경우
        else :
        	break
            
       	turn_time = 0
        
 # 정답 출력
 print(count)

 

Comments