(알고리즘) 백준 Fly me to the Alpha Centauri

코딩을 합시다·2022년 12월 22일
0
import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int T = Integer.parseInt(br.readLine());	// 테스트 케이스

        Long distance2 = 0L;
        for(int i = 0; i < T; i++) {

            StringTokenizer st = new StringTokenizer(br.readLine()," ");

            Long X = Long.parseLong(st.nextToken());
            Long Y = Long.parseLong(st.nextToken());
            ArrayList<Long> arr = new ArrayList<Long>();

            Long distance = Y-X;
            Long cnt = 1L;
            int answer = 0;
            while (true) {
                distance = distance - 2*cnt;
                arr.add(cnt);
                arr.add(cnt);
                cnt += 1;
                answer += 1;
                if (distance < 0) {
                    break;
                }
            }

            while (true) {
                if (distance >= 0) {
                    if (arr.contains(distance)) {
                        answer = arr.size() + 1;
                    } else {
                        answer = arr.size();
                    }
                    break;
                } else {
                    distance += arr.get(arr.size()-1);
                    arr.remove(arr.size()-1);
                }
            }
            System.out.println(answer);
        }
    }
}

나 같은 경우에는 이 문제를 풀때 끝부분을 한걸음만 가서 밟는 것이 아닌 일부러 제한선을 넘어버리고
내가 얼마나 초과해서 넘었는지를 계산해서 그 이후 초과한 부분들을 빼버리는 방식으로 이 문제를 풀었다.
예를 들어서 X = 0, Y = 50 일때 걸었던 걸음들을 전부 arr에 저장해준다.
arr = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7]가 나올 것이며 초과된 거리 distance = -6이 나온다.
여기서 가장 컸던 걸음 7을 빼주면서 arr = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7]로 바뀌며
distance 또한 0 보다 큰 1로 바뀐다.
이제 정답을 구해보자
arr의 모든 수 1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 + 5 + 5 + 6 + 6 + 7 = 49 이지만 아직 초과된 걸음(distance)을 더하지 않았다.
49 + 1 = 50
따라서 0 50 까지의 거리는 arr의 리스트 크기 13 + 초과된 걸음이 있기 때문에 1을 더해줘서 답은 14가 나오게 된다.

0개의 댓글