게임개발

Polla·2023년 1월 13일
post-thumbnail

" 이것이 코딩테스트다 with 파이썬" 연습



문제

💡 문제

현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다.
캐릭터가 있는 장소는 1 x 1 크기의 정사각형으로 이루어진 N x M 크기의 
정사각형으로, 각각의 칸은 육지 또는 바다이다.
맵의 각 칸은 (A, B)로 나타낼 수 있으며, 메뉴얼은 이렇다.

	1. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향 부터 차례대로
		갈곳을 정한다.
    2. 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재한다면,
        왼쪽 방향으로 한칸을 전진한다. 왼쪽 방향에 가보지 않은 칸이
        없디면, 왼쪽 방향으로 회전만 수행하고 1단계로 돌아간다.
    3. 만약 네 방향 모두 이미 가본 칸이거나 바다로 되어 있는 칸인
        경우에는, 바라보는 방향을 유지한 채로 한칸 뒤로 가고
        1단계로 돌아간다. 단 이때 뒤쪽 방향이 바다인 칸이라 뒤로 
        갈 수 없는 경우에는 움직임을 멈춘다. 

메뉴얼에 따라 캐릭터를 이동시킨 뒤에, 캐릭터가 방문한 칸의 수를 출력하는
프로그램을 만드시오.

📌 입력 조건

- 첫째 줄에 맵의 세로크기 N 과 가로크기 M을 공백으로 구분하여 입력한다.
	(3 <= N, M <= 50)
- 둘째 게임 캐릭터가 있는 칸의 좌표  (A, B)와 바라보는 방향 d가 각각
	서로 공백으로 구분하여 주어진다. 방향의 d값으로는 다음과 같이 4가지
    		- 0: 북쪽
            - 1: 동쪽
            - 2: 남쪽
            - 3: 서쪽
- 셋째 줄 부터 맵이 육지인지 바다인지에 대한 정보가 주어진다. N개의 줄에
	맵의 상태가 북쪽부터 남쪽 순서대로 각 줄의 데이터는 서쪽부터 동쪽 
    순서대로 주어진다. 맵의 외곽은 항상 바다로 되어있다.
    		- 0: 육지
    		- 1: 바다
- 처음에 게임 캐릭터가 위치한 칸의 상태는 항상 육지이다.

🔐 출력 조건

- 첫째 줄에 이동을 마친 후 캐릭터가 방문한 칸의 수를 출력한다.
ex)
	4 4
    1 1 0
    1 1 1 1
    1 0 0 1
    1 1 0 1
    1 1 1 1 출력: 3


🥔 해결


스스로 해결 실패...^^...

우선 실패 원인 부터 고찰해보자...

  1. 너무 많은 변수 사용

    	우선 변수를 사용해서 넣을 생각을 하니 자꾸 돌아갔다.. 예를 들어 갔던 길을 
    	a 라는 list에 넣어주어서 a 라는 list에 현재의 좌표가 있다면... 식으로 짜려했다.
  2. 공식 발견 못함

    		놀랍게도 나는 공식을 발견하려고 약 1시간동안 노트에 정리했다...
            심지어 방향을 다 연결해줬기 때문에 d에 -1을 하면 다음 d가 된다는 것을 싸놓고서
            발견하지 못했다... 
            그래서 d의 list를 두개 만들어서 연결해주려 한것이 더 복잡해졌다.
  3. 구조 짜기에 서툼

    	우선 인정해야 할 때가 왔다... 나는 구조를 못짜는것 같다.
        무엇을 써야 좋을지 어떻게 하면 좋을지는 생각을 잘하나 구조를 못짠다.
        사실 코드를 보면 좀 더 생각하면 해결할 수 있었는데 
        nx 와 ny를 따로 둬야 하는 이유를 생각하지 못해 문제가 생겼다. 
        그러니, 모든 if문에 좌표가 제자리지만 방향을 바뀔 방법을 생각해야했고 그러다보니
        복잡해지고 문제가 생겼다. 이건 문제 해석 능력에도 좀 문제가 있는듯...
        

우리 집 구조도 모르는데 코드 구조는 더 모르겠다

우선 내가 시도하려고 했던 코드로 성공해보자면 이런식이다.

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

array = []
for i in range (n):
    array.append(list(map(int, input().split())))
    
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
direction = [0, 1, 2, 3]
n_direction = [3, 0, 1, 2]

a = []
a.append([x, y])

turned = 0
ans = 1

while True:
    
    d = n_direction[direction.index(d)]
    
    nx = x + dx[d]
    ny = y + dy[d]
    # 이동  못한다면 위치는 그대로여야 하므로, nx 변수 사용

    if array[nx][ny] == 0 and [nx, ny] not in a:
        array[nx][ny] = 1
        x, y = nx, ny
        ans += 1
        turned = 0 
        a.append([nx, ny])
        continue
        # 진행했으나 가보지 않은 칸
    
    else:
        # 진행했으나 가본 칸이거나 바다이거나 판을 넘는다면
        turned += 1
    
    if turned == 4:
        # 전체 방향이 갈 수 없다면..
        nx = x - dx[d]
        ny = y - dy[d]    
        # 제자리로 돌아온 후
        
        if array[nx][ny] == 0:
            turned = 0
            x, y = nx, ny        
        else:
            break  
            
print(ans)

지금 보니 왜 못짰지..내가 이해했다는 소리겠지...?


후기...

	오늘은... 프로그래머스도 하나 더 풀고 이것도 복습하고 자야지...힘내자 감자
profile
트러블 슈팅 Blog => https://polla.palms.blog/home

0개의 댓글