구현 (Implementation) | 알고리즘

이남준·2021년 2월 4일
0

알고리즘

목록 보기
3/4
post-thumbnail
post-custom-banner

구현

머릿속에 있는 알고리즘을 소스코드로 바꾸는 과정

문제를 읽고, 문제 풀이 방법을 생각해내서 실제 코드로 구현 하는 과정

왕실의 나이트

8 * 8 크기의 체스판에 있는 나이트
나이트는 L자 형태로만 이동할 수 있고, 체스판 밖으로 나갈 수 없다
나이트의 이동 방식은 - 수평으로 두 칸 이동한 뒤 수직으로 한 칸 / 수직으로 두 칸 이동한 뒤 수평으로 한 칸 이다
나이트의 현재 위치가 주어지면, 이동할 수 있는 경우의 수를 구하시오

steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (1, 2), (-1, 2), (1, -2), (-1, -2)]

inp = input()
row = int(inp[1])
col = int(ord(inp[0]) - ord('a')) + 1  # 입력 받은 알파벳이 'a'와 얼만큼 차이가 나는지 

count = 0
for step in steps:
    next_row = row + step[0]
    next_col = col + step[1]

    if next_row >= 1 and next_row <= 8 and next_col >= 1 and next_col <= 8:
        count += 1

print(count)

게임 개발

캐릭터가 있는 장소는 N X M 크기의 직사각형, 각각의 칸은 육지 또는 바다이다
캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다
캐릭터의 이동 룰:

  • 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 90도)부터 차례대로 갈 곳을 정한다
  • 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재하면, 왼쪽 방향으로 회전한 다음 왼쪽으로 한 칸을 전진한다 / 왼쪽 방향에 가보지 않은 칸이 없다면 회전만 한다
  • 네 방향이 모두 가본 칸이거나 바다로 되어 있는 칸이면 바라보는 방향을 유지한 채로 한칸 뒤로 간다 / 뒤 쪽도 바다라면 움직임을 멈춘다
N, M = map(int, input().split())
x, y, d = map(int, input().split())

steps = [
    [3, 2, 1, 0],
    [0, 3, 2, 1],
    [1, 0, 3, 2],
    [2, 1, 0, 3]]

moves = [(0, 1), (1, 0), (0, -1), (-1, 0)]
count = 0

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

map[x][y] = -1
while True:
    didMove = False    
    for i in range(len(steps[d])):
        step = steps[d][i]
        next_x = x + moves[step][0]
        next_y = y + moves[step][1]

        if next_x >= 0 and next_x <= N and next_y >= 0 and next_y <= M:
            if map[next_x][next_y] == 0:
                map[next_x][next_y] = -1
                count += 1
                x = next_x
                y = next_y
                d = step
                didMove = True
                break
    
    if not didMove:
        step = steps[d][1]
        next_x = x + moves[step][0]
        next_y = y + moves[step][1]

        if next_x >= 0 and next_x <= N and next_y >= 0 and next_y <= M:
            if map[next_x][next_y] != 1:
                x = next_x
                y = next_y
            else:
                print(count)
                quit()    
        else:
            print(count)
            quit()    
profile
iOS 개발자의 기록
post-custom-banner

0개의 댓글