본문 바로가기
PS

구현 알고리즘 2

by solanarey 2023. 10. 8.

예시문제 3 (왕실의 나이트)

  • 행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면입니다. 왕실 정원의 특정한 한 칸에 나이트가 서 있습니다. 나이트는 매우 충성스러운 신하로서 매일 무술을 연마합니다.

  • 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없습니다.

  • 나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있습니다.

      1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
      1. 수직으로 두칸 이동한 뒤에 수평으로 한 칸 이동하기.
  • 이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하세요. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현합니다.

입력 조건

  • 첫째 줄에 8 x 8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.

입력 예시

a1

출력 조건

  • 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

출력 예시

2

해결 방법

  • 앞에서 풀었던 상하좌우 문제와 유사하다.

    • 나이트가 움직일 수 있는 방향벡터를 배열로 생성한다.
  • 좌표를 문자열로 입력받고 각 행과 열을 정수타입으로 저장한다.

코드

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
int row = input.charAt(1) - '0';
int column = input.charAt(0) - 'a' + 1;
int result = 0;

int[] dx = {1, -1, 1, -1, 2, -2, 2, -2};
int[] dy = {2, -2, -2, 2, 1, -1, -1, 1};

for(int i = 0; i < 8; i++) {
    int nextRow = row + dx[i];
    int nextColumn = column + dy[i];
    if(nextRow >= 1 && nextRow <= 8 && nextColumn >= 1 && nextColumn <= 8) result++;
}
System.out.println(result);
br.close();



예시문제 4 (문자열 재정렬)

  • 알파벳 대문자와 숫자(0 ~ 9)로만 구성된 문자열이 입력으로 주어집니다. 이때 모든 알파벳을 오름차순으로 정렬하여 이어서 출력한 뒤에, 그 뒤에 모든 숫자를 더한 값을 이어서 출력합니다.
  • 예를 들어 K1KA5CB7이라는 값이 들어오면 ABCKK13을 출력합니다.

입력 조건

  • 첫째 줄에 하나의 문자열 S가 주어집니다. (1 <= S의 길이 <= 10,000)

입력 예시

K1KA5CB7

출력 조건

  • 첫째 줄에 문제에서 요구하는 정답을 출력합니다.

출력 예시

ABCKK13

해결 방법

  • 입력받은 문자열에 각 요소가 문자인지 구별하여 문자인것들만 ArrayList에 add 해 준다.
  • 문자가 아닌 것들은 모두 더한다.

코드

public class Implement4 {
    static ArrayList<Character> arrayList = new ArrayList<>();
    static String input;
    static int sum = 0;

    public static void main(String[] args) throws IOException {
        //문자열 재정렬
        Scanner sc = new Scanner(System.in);
        input = sc.next();

        for (int i = 0; i < input.length(); i++) {
            if (Character.isLetter(input.charAt(i))) {
                arrayList.add(input.charAt(i));
            } else {
                sum += input.charAt(i) - '0';
            }
        }
        Collections.sort(arrayList);

        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i));
        }
        if (sum != 0) System.out.print(sum);
    }
}

참고: 이코테2021

'PS' 카테고리의 다른 글

[백준] 스택, 큐 문제들 (10828, 1406, 1966, 1158)  (0) 2024.09.25
[백준] 1920번 : 수 찾기  (0) 2023.10.26
구현 알고리즘 1  (1) 2023.10.08
그리디 알고리즘 2 (예시 문제 3, 4)  (1) 2023.10.05
그리디 알고리즘 1  (0) 2023.09.22