곽로그

[백준 1011] Fly me to the Alpha Centauri 본문

알고리즘/백준

[백준 1011] Fly me to the Alpha Centauri

일도이동 2019. 5. 15. 00:33
반응형

 

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

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행사가 되어 새로운 세계에 발을 내려 놓는 영광의 순간을 기다리고 있다. 그가 탑승하게 될 우주선은 Alpha Centauri라는 새로운 인류의 보금자리를 개척하기 위한 대규모 생활 유지 시스템을 탑재하고 있기 때문에, 그 크기와 질량이 엄청난 이유로 최신기술력을

www.acmicpc.net

 

문제접근

거리가 1부터 10까지에 대한 경우를 하나씩 써나가다보면 규칙이 보인다. 

거리(d) 1 2 3 4 5 6 7 8 9
횟수(n) 1 2 3 3 4 4 5 5 5

이렇게 쭉 써나가다면 횟수가 증가하는 규칙이 1/2/33/44/555/666/7777/8888 이렇게 하나 하나 둘 둘 셋 셋 넷 넷 이렇게 증가한다. 이걸 뭐라고 표현해야하나. 말로 정확히 표현을 못하니 처음에는 규칙을 찾기가 어려웠다. 말로 표현을 간단하게 할 수 있으면 코딩으로 옮기는 것도 상대적으로 간단하게 할 수있는 것 같다. 

 

 

이렇게 풀었다. 각각 군으로 묶어서 맨 끝 항을 보면 공차가 등차인 수열이다. 그걸 이용해서 횟수를 구했는데

package gogogo;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int T=in.nextInt();
		for(int testCase=0;testCase<T;testCase++) {
			int x=in.nextInt();
			int y=in.nextInt();
			
			int distance=y-x;
			
			int n=0;
			int seq=0;
			
			while(true) {
				if(distance>n) {
					seq+=2;
					n+=seq;					
				}
				else {
					break;
				}
			}
			
			if(distance>n-(seq/2)) {
				System.out.println(seq);
			}
			else {
				System.out.println(seq-1);
			}
			
		}
	}
}

 시간 초과가 난다. 입력이 2의 31승까지인데 while문에서 시간초과가 나는 거겠지. 라고 생각하다가 int 를 long으로 바꿔주니까 된다. 

 

package gogogo;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int T=in.nextInt();
		for(int testCase=0;testCase<T;testCase++) {
			long x=in.nextInt();
			long y=in.nextInt();
			
			long distance=y-x;
			
			long n=0;
			long seq=0;
			
			while(true) {
				if(distance>n) {
					seq+=2;
					n+=seq;					
				}
				else {
					break;
				}
			}
			
			if(distance>n-(seq/2)) {
				System.out.println(seq);
			}
			else {
				System.out.println(seq-1);
			}
			
		}
	}
}

 

package math;

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

public class Alpha {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		int T =Integer.parseInt(br.readLine());
		
		for( int i = 0; i < T ; i++) {
			String line = br.readLine();
			StringTokenizer st = new StringTokenizer(line);
			long x = Long.parseLong(st.nextToken());
			long y = Long.parseLong(st.nextToken());
			
			long distance = y-x;
			
			long n = 0;
			long minLeft = 1;
			long minRight =0;
			while(true) {
				minLeft += 2 * n;
				minRight = (minLeft +2*(n+1));
				
				
				if(distance >= minLeft && distance<minRight) {
					break;
				}
				n++;
			}
			if(distance <((minLeft+minRight)/2)) {
				bw.write(Long.toString(2*n+1)+"\n");
			}else {
				bw.write(Long.toString(2*n+2)+"\n");
			}
			
		}
		br.close();
		bw.close();
		
	}
}
반응형

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

[백준 2884] 알람시계  (0) 2019.10.29
[백준 2753] 윤년  (0) 2019.10.27
[백준 1475] 방 번호  (0) 2019.05.13
[백준 10250] ACM호텔  (0) 2019.05.07
[백준 2839] 설탕배달  (0) 2019.05.03
Comments