-
[구현] 문제 이름 : 왕실의 나이트Algorithm/유형별 문제 풀기 2021. 6. 29. 12:10
문제 설명
8 x 8 좌표 평면이 있고, 나이트는 이동 할 때 L자 형태로만 이동이 가능하다. 나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
1. 수평을 2칸 이동한 뒤에 수직으로 1칸 이동하기
2. 수직으로 2칸 이동한 뒤에 수평으로 1칸 이동하기
이처럼 8 x 8 좌표 평면 상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램 작성하기
(행 위치 표현은 1~8, 열 위치 표현은 a~h)
1. 사용 알고리즘
구현 - 모든 경우의 수 탐색
2. 문제 해결 아이디어
나이트가 좌표 평면에서 상하좌우로 이동 가능한 모든 경우의 수에 대해 행과 열 각각의 이동 거리를 저장해둔다. 주어진 나이트의 위치를 바탕으로 모든 이동 가능 경우에 대해 좌표 값을 계산하고, 좌표를 벗어나지 않는 경우에 대해서 찾으면 된다.
3. 코드
구현 방식)
움직일 수 있는 경우에 대해 각각의 row와 col 이동 거리를 2개의 배열의 동일한 Index 위치에 저장한다. -> 형태 잘 기억해두기!
모든 경우에 대해 확인하며 이동 후의 좌표 평면 위치를 계산해 범위를 벗어난 경우 전체 경우의 수에서 빼준다.
import java.util.Scanner; public class q1 { public static void main(String[] args) { Scanner kbd = new Scanner(System.in); //움직일 수 있는 경우의 수 : 8가지 int dx[] = {2, 2, -2, -2, 1, -1, 1, -1}; //row에 대해 이동할 수 있는 경로 int dy[] = {1, -1, 1, -1, 2, 2, -2, -2}; //col에 대해 이동할 수 있는 경로 //나이트의 좌표 평면 상 위치 입력 String inputData = kbd.nextLine(); int col = inputData.charAt(0) - 'a' + 1; //문자로 주어진 좌표를 int로 변환하기 : char to int int row = inputData.charAt(1) - '0'; int cnt = 8; //전체 경우의 수 for(int i = 0; i < dx.length; i++) { int col_y = col + dy[i]; int row_x = row + dx[i]; if(col_y < 1 || col_y > 8 || row_x < 1 || row_x > 8) //조건을 만족하지 않을 때 : 좌표의 범위를 벗어났을 때 cnt--; } System.out.println(cnt); } }
추가로 개념 정리)
*String -> char -> int
1. Scanner 클래스의 nextLine()으로 String 입력
2. String 클래스의 charAt(int index)로 특정 index의 String을 char로 형변환
3. char값 - '0' 으로 입력한 숫자 획득 가능
char(0~9)는 아스키 코드 48부터 시작함 -> '0' = 48, '1' = 49 . . .
숫자 char - '0'을 통해 입력한 숫자를 얻을 수 있음
'Algorithm > 유형별 문제 풀기' 카테고리의 다른 글
[DFS/BFS] 문제이름 : 음료수 얼려 먹기 (0) 2021.07.05 [구현] 문제이름 : 게임 개발 (0) 2021.06.30 [구현] 문제 이름 : 시각 (0) 2021.06.29 [그리디] 1이 될 때까지 (0) 2021.06.26 [그리디] 숫자 카드 게임 (0) 2021.06.25