띠리링구 2022. 3. 24. 03:52

책에서 이거 지금까지 해온거랑 똑같다고 해설 없이 풀어보라 그래서 하루 종일 고민했는데 모르겠다 ㅋㅋ 아 자괴감+1..

 

결국 해설을 보게 되었다 ㅠ

 

해설을 보고 왔는데 엥? 싶다. 이게 이렇게 된다고?

ways 배열을 만든다. 3차원 배열이다.

ways[row][column][nummoves]

그니까 좌표 0,1로 5번만에 갈 수 있는 방법의 수는 ways[0][1][5]에 기록되는거다.

그럼 이 3차원 배열을 어떻게 구성하냐?

 

dx = [1,1,1,0,-1,-1,-1,0,2,1,-1,-2,-2,-1,1,2]
dy = [1,0,-1,-1,-1,0,1,1,-1,-2,-2,-1,1,2,2,1]

ways = [[[0] * 55 for _ in range(100)] for _ in range(100)]

def howmany(size, start, end, nummoves):

    sx, sy = start
    ex, ey = end

    ways[sy][sx][0] = 1

    for i in range(1, nummoves+1):
        for x in range(size):
            for y in range(size):
                for j in range(16):
                    nx = x + dx[j]
                    ny = y + dy[j]
                    if nx<0 or ny<0 or nx>=size or ny>=size:
                        continue
                    
                    ways[ny][nx][i] += ways[y][x][i-1]

    return ways[ey][ex][nummoves]

 

의외로 너무 간결한 코드에 놀랬을지도 모른다.

나도 그랬으니까.

 

ny,nx 지점에 i번의 move로 갈 수 있는 방법의 수는

y,x지점에 i-1번의 move로 갈 수 있는 방법의 수의 합이라는 것 같다.

-> 왜 이런건지 직관을 못찾겠다

 

근데.. 잘 모르겠다 아직.. 이게 왜 되는거지?;;

일단 핵심은 단계별로 이동 가능한 곳에 +하는 거라는거.

 

고민좀 더 해봐야겠다..