백준/Java

[백준 1011] Fly me to the Alpha Centauri - JAVA

SH3542 2024. 7. 19. 00:40

BOJ Link

 

풀이 과정

다른 행성에 도달하기 직전의 칸은 k가 1이여야 한다.

그렇다면, 러프하게 1 - (k올림) - max - (k내림) - 1의 꼴로 k가 전개됨을 알 수 있다.

 

몇 개의 케이스를 만들어 봤을 때,

 

1. k가 올림 - 내림 - 올림 등인 변칙적인 경로일 때 값이 최적인 경우는 없다고 생각했다.

2. 값을 누적했을 때, 더이상 k를 증가시킬 수 없다면, 경로에 사용되었던 k들로 모든 답을 구성할 수 있다고 생각했다.

(아마 최대 2번 더 사용해서)

 

그래서, 현재 이동한 거리 sum과 k를 비교하여,

1. dis <= sum + k + (k + 1)라면, dis에 값을 누적하고 k를 올린다.

2. dis > sum + k + (k + 1)라면, 사용된 k중 가장 큰 수부터 비교하며 최적해를 찾는다.

로 구현하였다.

 

일반적인 구현은 좀 더 수학적인 내용이 담겨있다.

 

제출 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int from = Integer.parseInt(st.nextToken());
            int to = Integer.parseInt(st.nextToken());
            int dis = to - from;

            if (from == to) {
                System.out.println(0);
                continue;
            }

            long sum = 1;
            int step = 1;
            int dep = 1;
            
            while (true) {

                if (sum == dis) break;

                // 갈 수 없으면 사용한 k들로 답 도출
                if (dis < sum + dep + dep + 1) {
                    while (dep > 0) {
                        if (dep <= dis - sum) {
                            sum += dep;
                            step++;
                        } else dep--;
                    }

                }
                // 갈 수 있으면 k, k+1 만큼 이동
                else {
                    sum += dep;
                    sum += dep + 1;
                    step += 2;
                    dep++;
                }
            }

            System.out.println(step);
        }
    }
}

'백준 > Java' 카테고리의 다른 글

[백준 1245] 농장 관리 - JAVA  (2) 2024.07.22
[백준 1202] 보석 도둑 - JAVA  (0) 2024.07.20
[백준 1195] 킥다운 - JAVA  (0) 2024.07.18
[백준 1106] 호텔 - JAVA  (0) 2024.07.16
[백준 1047] 울타리 - JAVA  (0) 2024.07.15