[백준] 1063번 : 킹 (🥈실버 4) (Python)

2023. 1. 22. 04:22·◼ PS Note/백준
반응형

문제 바로 가기

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

 


풀이

  • 사용 언어 : Python
  • 풀이한 날짜 : 2022-03-11
place = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

dxs = [0, 1, 1, 1, 0, -1, -1, -1]
dys = [1, 1, 0, -1, -1, -1, 0, 1]

king, stone, n = tuple(input().split())
n = int(n)

king_x = place.index(king[0]) + 1
king_y = int(king[1])

stone_x = place.index(stone[0]) + 1
stone_y = int(stone[1])

mapper = {
    'T' : 0,
    'RT' : 1,
    'R' : 2,
    'RB' : 3,
    'B' : 4,
    'LB' : 5,
    'L' : 6,
    'LT' : 7
}

def in_range(x, y):
    return x >= 1 and x <= 8 and y >= 1 and y <= 8

def move(dir_num):
    global king_x, king_y, stone_x, stone_y

    king_nx = king_x + dxs[dir_num]
    king_ny = king_y + dys[dir_num]

    if in_range(king_nx, king_ny):
        king_x = king_nx
        king_y = king_ny
    else:
        return

    if king_x == stone_x and king_y == stone_y:
        stone_nx = stone_x + dxs[dir_num]
        stone_ny = stone_y + dys[dir_num]

        if not in_range(stone_nx, stone_ny):
            king_x = king_x - dxs[dir_num]
            king_y = king_y - dys[dir_num]
        else:
            stone_x = stone_nx
            stone_y = stone_ny


for _ in range(n):
    direction = input()
    dir_num = mapper[direction]
    move(dir_num)

# 출력
king_x = place[king_x - 1]
print(king_x + str(king_y))

stone_x = place[stone_x - 1]
print(stone_x + str(stone_y))

 

풀이 로직

  • 2차원 평면에서 한 칸씩 이동하는 상황의 문제에 유용한 dx-dy 테크닉을 활용하여 문제를 해결하였다.
  • 우선, 말의 위치를 모두 숫자로 나타내고, 킹의 움직임 정보에 따른 다음 킹의 위치를 계산한다.
    • 이 때 각 정보에 따라 킹이 어떻게 움직여야 하는지는 mapper 딕셔너리와 dxs, dys 리스트로 표현하었다.

 

  • 그리고, 그렇게 계산한 킹의 다음 예상 좌표가 체스판을 벗어나진 않았는지, 혹은 돌이 그 위치에 존재하는지의 경우를 각각 따져, 킹과 돌의 다음 위치를 확정한다. (move() 함수로 구현)
    • 킹의 다음 예상 좌표가 체스판을 벗어나면, move() 함수를 반환하여 해당 이동을 건너뛴다.
    • 만일 체스판을 벗어나지 않았다면, 돌이 킹의 다음 예상 좌표에 존재하는 지를 확인한다.
    • 물론, 돌도 킹과 함께 이동해야 하는 경우, 체스판을 벗어나는지를 또 따져봐야 한다. (벗어나면 킹의 이동도 취소해야 한다.)

 

  • 이 과정을 n번 반복하면, 최종 킹과 돌의 위치를 구할 수 있다.

 

문제 접근 과정 및 느낀점

  • 백준에서 처음으로 dx-dy 테크닉을 써서 푼 문제였는데, 꽤 따져야 부분이 많아 까다로웠다.
  • 방향만 8개로 증가했을 뿐, 캠프 때 학습했던 내용에서 크게 벗어나지 않는 문제라, 로직은 어렵지 않게 세울 수 있었다.
  • 하지만, 문자열 입력값을 깜박하고 숫자형으로 변환하지 않는다던가, 킹과 돌이 체스판을 벗어나는 경우를 미쳐 생각하지 못하던가 등의 미스로 인해 코드 구현 및 수정 작업 과정에서 애를 먹었다.
  • 그래도 오로지 혼자의 힘으로 문제를 해결할 수 있어서 만족스럽다.
  • 문제를 좀 더 간단하게 풀 방법이 있을 것 같다는 생각은 들지만, 지금 이렇게 푼 것도 쉽지 않았기에, 일단 이 문제는 여기서 넘어가려 한다.
  • (P.S. 개인적으로 실버4 수준의 문제는 아닌 듯..)

 

반응형

'◼ PS Note > 백준' 카테고리의 다른 글

[백준] 15650번 : N과 M (2) (🥈실버 2) (Python)  (0) 2023.02.22
[백준] 1929번 : 소수 구하기 (🥈실버 3) (Python)  (0) 2023.02.22
[백준] 1929번 : 소수 구하기 (🥈실버 3)  (0) 2023.01.22
[백준] 1037번 : 약수 (🥈실버 5) (Python)  (0) 2023.01.22
[백준] 1292번 : 쉽게 푸는 문제 (🥈실버 5) (Python)  (0) 2023.01.22
'◼ PS Note/백준' 카테고리의 다른 글
  • [백준] 15650번 : N과 M (2) (🥈실버 2) (Python)
  • [백준] 1929번 : 소수 구하기 (🥈실버 3) (Python)
  • [백준] 1929번 : 소수 구하기 (🥈실버 3)
  • [백준] 1037번 : 약수 (🥈실버 5) (Python)
SangYoonLee (SYL)
SangYoonLee (SYL)
Slow, But Steady Wins The Race 😎
    반응형
  • SangYoonLee (SYL)
    ◆ Slow, But Steady ◆
    SangYoonLee (SYL)
  • 전체
    오늘
    어제
    • ◻ 전체 글 수 : (132)
      • ✪ 취미, 경험 회고 및 일상 (26)
        • [취미] Room Escape (2)
        • [회고] IT 관련 경험 회고 (18)
        • [일상] 일상 생각 (4)
        • [일상] 독후감 (1)
      • ◼ FrontEnd (30)
        • Web & HTML, CSS (9)
        • JavaScript (4)
        • TypeScript (1)
        • ReactJS (16)
      • ◼ CS (3)
        • 자료구조 & 알고리즘 (1)
        • 컴퓨터 구조 (1)
        • 운영체제 (1)
      • ◼ PS Note (40)
        • 백준 (38)
        • 프로그래머스 (2)
      • ◼ IT Etc. (33)
        • (Until 2021) (21)
        • Python (6)
        • C | C# | C++ (1)
        • Git (1)
        • Unity (4)
        • Game Dev. (0)
  • 블로그 메뉴

    • 홈
    • 💻 GitHub
    • 🟢 Velog
    • 🧩 온라인 방탈출 출시 작품 모음
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    CodeSoom
    wecode
    Python
    React
    개인 프로젝트
    리엑트
    프로그래머스
    주간 회고
    관심사의 분리
    알고리즘
    더라비린스
    프로젝트
    파이썬
    회고
    위코드
    pygame
    소수 구하기
    Cpp
    C++
    미궁 게임
    코딩 일기
    unity
    후기
    Component
    1929
    JavaScript
    코드숨
    방탈출고사
    백준
    유니티
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
SangYoonLee (SYL)
[백준] 1063번 : 킹 (🥈실버 4) (Python)
상단으로

티스토리툴바