본문 바로가기
C#/백준 알고리즘

2022.01.26 [백준] C# Fly me to the Alpha Centauri

by ian's coding 2022. 1. 26.
728x90
반응형

 

 

 

 

https://www.acmicpc.net/problem/1011

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행

www.acmicpc.net

 


 

https://dev-minji.tistory.com/52

 

[백준/C++] 1011번 : Fly me to the Alpha Centauri

문제 우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주

dev-minji.tistory.com

설명이 어려워 위의 블로그에서 풀이를 가져 왔다.

 

풀이

이 문제는 규칙을 정확하게 찾아야 해서 조금 어려웠다. 총 2가지의 규칙이 있는데 첫 번째 규칙까지만 알아내서 다른 블로그를 참고하여 코드를 짰다.

01. 처음과 마지막에는 무조건 1광년을 이동해야 한다.

문제의 핵심은 "마지막에 1광년을 이동해야 한다"는 것이다. 

때문에 이동할 경우 1 -> 2 -> .... -> 2 -> 1 순서로 이동해야 한다. 

1 > 2 > 1 = 1+2+1 = 4 -> 2*2 (이동횟수 3)

1 > 2 > 3 > 2 > 1 = 1+2+3+2+1 = 9 -> 3*3 (이동횟수 5)

1 > 2 > 3 > 4 > 3 > 2 > 1 = 1+2+3+4+3+2+1 = 16 = 4*4 (이동횟수 7)

=> 최대 이동 속도 = N^2, 이동 횟수 = 2N-1임을 확인할 수 있다. 

02. 차원 이동의 횟수 계산

위의 계산으로 두 지점 간의 거리가 제곱수일때의 최소 이동 횟수를 구했다. 다른 경우에는 어떨까?

 

https://jaynamm.tistory.com/entry/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-1011%EB%B2%88-Fly-me-to-the-Alpha-Centauri 님이 올린 표에 잘 정리되어 있다.

 

각 거리의 제곱근과 제곱근의 반올림 값을 보면 

제곱근 <= 반올림값일 경우, 2*반올림 - 1

제곱근 > 반올림값일 경우 2*반올림 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Text;
class Program{
    static int Cal(int start, int end){
        int distance=end-start;
        double N = Math.Sqrt(distance);
        //N을 반올림하고 나서 (int)로 변환해줘야함. 하지않으면 반올림되서 정수형태지만 double로 
        //인식되서 타입오류뜸.
        int Nround = (int)Math.Round(N);
        if(N<=Nround){
            return Nround*2-1;
        }else{
            return Nround*2;
        }
    }
    static void Main(){
        StringBuilder sb = new StringBuilder();
        int t = int.Parse(Console.ReadLine());
        for(int i=0;i<t;i++){
            string[] s = Console.ReadLine().Split();
            int start=int.Parse(s[0]);
            int end=int.Parse(s[1]);
            sb.Append(Cal(start, end)+"\n");
        }
        Console.WriteLine(sb);
    }
}
cs

 

Sqrt를 이용해 제곱수를 구하고, 구한 제곱수를 Round를 이용해 반올림해 제곱수와 반올림한 값을 비교함.

 

728x90
반응형

댓글