[백준] 1063 - 킹
[백준] 1063 - 킹

[백준] 1063 - 킹

언어
Python
C++
난이도
Sliver 3
다시 풀어보기
다시 풀어보기
알고리즘 유형
구현
작성자
박용성박용성
생성 일시
2024년 10월 13일

🖥 시작하며

단순한 구현 문제다. 문제의 조건을 읽어보며 하나하나 구현하면 된다.
  1. 체스판의 좌표, 즉 입력받은 값을 숫자로 변환해 저장해야 한다.
  1. 체스판을 벗어나는 경우를 따져야 한다.
    1. 킹이 돌을 만났을 때, 만나지 않았을 때를 구분한다.
 
king, stone, N = input().rstrip().split() king = list(map(int, [ord(king[0]) - 64, king[1]])) stone = list(map(int, [ord(stone[0]) - 64, stone[1]]))
우선 입력받은 좌표를 숫자로 변환해 리스트로 만들어 넣어주었다. 파이썬에서 ord 는 문자를 정수로 변환한다.
 
move = { "R": [1, 0], "L": [-1, 0], "B": [0, -1], "T": [0, 1], "RT": [1, 1], "LT": [-1, 1], "RB": [1, -1], "LB": [-1, -1], }
이후 나중에 구현하기 편하도록 값을 입력받았을 때 어떤 방향으로 이동하는지 미리 딕셔너리를 만들어 놓는다.
 
m = input().rstrip() # 움직였을 경우의 위치 : dx, dy dx = king[0] + move[m][0] dy = king[1] + move[m][1] # 체스판 위에 존재 if 0 < dx <= 8 and 0 < dy <= 8: # 킹이 돌 위에 올라감 if dx == stone[0] and dy == stone[1]: sx = stone[0] + move[m][0] sy = stone[1] + move[m][1] # 돌도 체스판 위에 존재하면 둘 다 이동 if 0 < sx <= 8 and 0 < sy <= 8: king = [dx, dy] stone = [sx, sy] else: king = [dx, dy] # 킹만 이동
이후는 간단하다. 문제에 주어진 조건에 따라 if 문으로 구현하면 된다.
 

⚙️ 코드

import sys input = sys.stdin.readline def solution(king: list, stone: list, move: list) -> None: for _ in range(int(N)): m = input().rstrip() # 움직였을 경우의 위치 : dx, dy dx = king[0] + move[m][0] dy = king[1] + move[m][1] # 체스판 위에 존재 if 0 < dx <= 8 and 0 < dy <= 8: # 킹이 돌 위에 올라감 if dx == stone[0] and dy == stone[1]: sx = stone[0] + move[m][0] sy = stone[1] + move[m][1] # 돌도 체스판 위에 존재하면 둘 다 이동 if 0 < sx <= 8 and 0 < sy <= 8: king = [dx, dy] stone = [sx, sy] else: king = [dx, dy] # 킹만 이동 print(f"{chr(king[0] + 64)}{king[1]}") print(f"{chr(stone[0] + 64)}{stone[1]}") if __name__ == "__main__": king, stone, N = input().rstrip().split() king = list(map(int, [ord(king[0]) - 64, king[1]])) stone = list(map(int, [ord(stone[0]) - 64, stone[1]])) # 이동 딕셔너리 생성 move = { "R": [1, 0], "L": [-1, 0], "B": [0, -1], "T": [0, 1], "RT": [1, 1], "LT": [-1, 1], "RB": [1, -1], "LB": [-1, -1], } solution(king, stone, move)
#include <iostream> #include <map> #include <string> #include <vector> using namespace std; void solution(vector<int> &king, vector<int> &stone, map<string, vector<int>> &move, int N) { for (int i = 0; i < N; i++) { string m; cin >> m; // 움직였을 경우의 위치 : dx, dy int dx = king[0] + move[m][0]; int dy = king[1] + move[m][1]; // 체스판 위에 존재 if (0 < dx && dx <= 8 && 0 < dy && dy <= 8) { // 킹이 돌 위에 올라감 if (dx == stone[0] && dy == stone[1]) { int sx = stone[0] + move[m][0]; int sy = stone[1] + move[m][1]; // 돌도 체스판 위에 존재하면 둘 다 이동 if (0 < sx && sx <= 8 && 0 < sy && sy <= 8) { king = {dx, dy}; stone = {sx, sy}; } } else { king = {dx, dy}; // 킹만 이동 } } } cout << char(king[0] + 64) << king[1] << endl; cout << char(stone[0] + 64) << stone[1] << endl; } int main() { string king_str, stone_str; int N; cin >> king_str >> stone_str >> N; vector<int> king = {king_str[0] - 'A' + 1, king_str[1] - '0'}; vector<int> stone = {stone_str[0] - 'A' + 1, stone_str[1] - '0'}; // 이동 맵 생성 map<string, vector<int>> move = { {"R", {1, 0}}, {"L", {-1, 0}}, {"B", {0, -1}}, {"T", {0, 1}}, {"RT", {1, 1}}, {"LT", {-1, 1}}, {"RB", {1, -1}}, {"LB", {-1, -1}}}; solution(king, stone, move, N); return 0; }

📌 소감

 

댓글

guest