728x90
실전문제) 왕실의 나이트
- 행복 왕국의 왕실 정원은 체스판과 같은 8X8 좌표 평면이다
- 왕실 정원의 특정한 한 칸에 나이트가 서 있다
- 나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
- 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
- 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
- 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
- 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
- 이처럼 8X8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오
- 이 때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현한다
- 에를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음 2가지이다
- a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다
- 오른쪽으로 두 칸 이동 후 아래로 한 칸 이동하기 -> c2
- 아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기 -> b3
- 또 다른 에로 나이트가 c2에 위치해 있다면 이동할 수 있는 경우의 수는 6가지이다
입력 조건)
- 첫째 줄에 8X8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다
- 입력 문자는 a1처럼 열과 행으로 이루어진다
출력 조건)
- 첫쨰 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오
입력 예시)
a1
출력 예시)
2
풀이)
이는 주어진 위치에서 나이트가 이동할 수 있는 경로를 하나씩 확인하여 이동하면 된다
단, 8X8 좌표 평면을 벗어나지 않도록 검사하는 과정이 필요하다
나이트의 2가지 경로를 steps 변수에 넣으면 다음과 같다
steps = [ (-2, -1), (-2, 1), (2, -1), (2, 1), (1, -2), (1, 2), (-1, -2), (-1, 2) ]
현재 위치를 기준으로 "수평 2칸 수직 1칸" 또는 "수직 2칸 수평 1칸"으로 이동한 결과이다
파이썬 코드)
#현재 나이트의 위치 입력받기
night = input()
row = int(night[1])
col = int(ord(night[0])) - int(ord('a')) + 1
#나이트의 이동 경로 정의
steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (1, -2), (1, 2), (-1, -2), (-1, 2)]
result=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:
result+=1
print(result)
와 진짜 파이썬 너무 간단해,,, 미쳤는데..?
왠만한 문자열은 파이썬으로 푸는게 더 쉬운듯???
일단 c++도 도전..!
C++ 코드)
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string night;
cin>>night;
int row = night[1] - '0';
int col = night[0] - 'a' + 1;
int result=0;
// 나이트가 이동할 수 있는 8가지 방향 정의
//(-2,-1), (-2, 1), (2,-1), (2,1), (1,-2), (1,2) ,(-1,-2), (-1, 2)
int dx[] = {-2, -2, 2, 2, 1, 1, -1, -1};
int dy[] = {-1, 1, -1, 1, -2, 2, -2, 2};
for(int i=0;i<8;i++)
{
int next_row = row + dx[i];
int next_col = col + dy[i];
if(next_row>=1 && next_row<=8 && next_col>=1 && next_row<=8)
{
result++;
}
}
printf("%d\n", result);
return 0;
}
오 생각보다 나쁘지 않다
여기서 다른건 dx, dy로 행 열 이동 경로 배열을 따로 선언한거랑 string으로 입력받은 문자열 나눠서 행열 구하기 정도?
c++도 string 헤더가 있어서 어렵진 않다!
암튼 끝! 빠잉~
728x90
'코딩테스트 > 이코테' 카테고리의 다른 글
[CH5 DFS/BFS] 꼭 필요한 자료구조 기초 (0) | 2021.12.20 |
---|---|
[CH4 구현] 게임 개발 (0) | 2021.12.09 |
[CH4 구현] 아이디어를 코드를 바꾸는 구현 3 (0) | 2021.12.07 |
[CH4 구현] 아이디어를 코드를 바꾸는 구현 2 (0) | 2021.12.06 |
[이것이 코딩 테스트다 with python] 유튜브 강의 링크 (0) | 2021.12.06 |
댓글