✨ Algorithm

[λ°±μ€€/C++] 1011번 : Fly me to the Alpha Centauri

nitronium102 2021. 8. 5. 23:26

문제

μš°ν˜„μ΄λŠ” μ–΄λ¦° μ‹œμ ˆ, 지ꡬ μ™Έμ˜ λ‹€λ₯Έ ν–‰μ„±μ—μ„œλ„ 인λ₯˜λ“€μ΄ μ‚΄μ•„κ°ˆ 수 μžˆλŠ” λ―Έλž˜κ°€ 였리라 λ―Ώμ—ˆλ‹€. 그리고 κ·Έκ°€ μ§€κ΅¬λΌλŠ” 세상에 λ°œμ„ λ‚΄λ € 놓은 지 23년이 μ§€λ‚œ μ§€κΈˆ, 세계 μ΅œμ—°μ†Œ ASNA 우주 비행사가 λ˜μ–΄ μƒˆλ‘œμš΄ 세계에 λ°œμ„ λ‚΄λ € λ†“λŠ” μ˜κ΄‘μ˜ μˆœκ°„μ„ 기닀리고 μžˆλ‹€.

κ·Έκ°€ νƒ‘μŠΉν•˜κ²Œ 될 μš°μ£Όμ„ μ€ Alpha CentauriλΌλŠ” μƒˆλ‘œμš΄ 인λ₯˜μ˜ 보금자리λ₯Ό κ°œμ²™ν•˜κΈ° μœ„ν•œ λŒ€κ·œλͺ¨ μƒν™œ μœ μ§€ μ‹œμŠ€ν…œμ„ νƒ‘μž¬ν•˜κ³  있기 λ•Œλ¬Έμ—, κ·Έ 크기와 μ§ˆλŸ‰μ΄ μ—„μ²­λ‚œ 이유둜 μ΅œμ‹ κΈ°μˆ λ ₯을 총 λ™μ›ν•˜μ—¬ κ°œλ°œν•œ 곡간이동 μž₯치λ₯Ό νƒ‘μž¬ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ 이 곡간이동 μž₯μΉ˜λŠ” 이동 거리λ₯Ό κΈ‰κ²©ν•˜κ²Œ 늘릴 경우 기계에 μ‹¬κ°ν•œ 결함이 λ°œμƒν•˜λŠ” 단점이 μžˆμ–΄μ„œ, 이전 μž‘λ™μ‹œκΈ°μ— k광년을 μ΄λ™ν•˜μ˜€μ„ λ•ŒλŠ” k-1 , k ν˜Ήμ€ k+1 κ΄‘λ…„λ§Œμ„ λ‹€μ‹œ 이동할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 이 μž₯치λ₯Ό 처음 μž‘λ™μ‹œν‚¬ 경우 -1 , 0 , 1 광년을 이둠상 이동할 수 μžˆμœΌλ‚˜ 사싀상 음수 ν˜Ήμ€ 0 거리만큼의 이동은 μ˜λ―Έκ°€ μ—†μœΌλ―€λ‘œ 1 광년을 이동할 수 있으며, κ·Έ λ‹€μŒμ—λŠ” 0 , 1 , 2 광년을 이동할 수 μžˆλŠ” 것이닀. ( μ—¬κΈ°μ„œ λ‹€μ‹œ 2광년을 μ΄λ™ν•œλ‹€λ©΄ λ‹€μŒ μ‹œκΈ°μ—” 1, 2, 3 광년을 이동할 수 μžˆλ‹€. )

κΉ€μš°ν˜„μ€ 곡간이동 μž₯치 μž‘λ™μ‹œμ˜ μ—λ„ˆμ§€ μ†Œλͺ¨κ°€ ν¬λ‹€λŠ” 점을 잘 μ•Œκ³  있기 λ•Œλ¬Έμ— xμ§€μ μ—μ„œ y지점을 ν–₯ν•΄ μ΅œμ†Œν•œμ˜ μž‘λ™ 횟수둜 μ΄λ™ν•˜λ € ν•œλ‹€. ν•˜μ§€λ§Œ y지점에 λ„μ°©ν•΄μ„œλ„ 곡간 이동μž₯치의 μ•ˆμ „μ„±μ„ μœ„ν•˜μ—¬ y지점에 λ„μ°©ν•˜κΈ° λ°”λ‘œ μ§μ „μ˜ μ΄λ™κ±°λ¦¬λŠ” λ°˜λ“œμ‹œ 1κ΄‘λ…„μœΌλ‘œ ν•˜λ € ν•œλ‹€.

κΉ€μš°ν˜„μ„ μœ„ν•΄ x지점뢀터 μ •ν™•νžˆ yμ§€μ μœΌλ‘œ μ΄λ™ν•˜λŠ”λ° ν•„μš”ν•œ 곡간 이동 μž₯치 μž‘λ™ 횟수의 μ΅œμ†Ÿκ°’을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ.

μž…λ ₯

μž…λ ₯의 첫 μ€„μ—λŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 개수 Tκ°€ 주어진닀. 각각의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ ν˜„μž¬ μœ„μΉ˜ x 와 λͺ©ν‘œ μœ„μΉ˜ y κ°€ μ •μˆ˜λ‘œ 주어지며, xλŠ” 항상 y보닀 μž‘μ€ 값을 κ°–λŠ”λ‹€. (0 ≤ x < y < 2^31)

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄ xμ§€μ μœΌλ‘œλΆ€ν„° yμ§€μ κΉŒμ§€ μ •ν™•νžˆ λ„λ‹¬ν•˜λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ κ³΅κ°„이동 μž₯치 μž‘λ™ 횟수λ₯Ό 좜λ ₯ν•œλ‹€.

풀이

이 λ¬Έμ œλŠ” κ·œμΉ™μ„ μ •ν™•ν•˜κ²Œ μ°Ύμ•„μ•Ό ν•΄μ„œ 쑰금 μ–΄λ €μ› λ‹€. 총 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 λ‹˜μ΄ 올린 ν‘œμ— 잘 μ •λ¦¬λ˜μ–΄ μžˆλ‹€.

jaynamm.tistory.com의 자료

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

제곱근 <= λ°˜μ˜¬λ¦Όκ°’μΌ 경우, 2*반올림 - 1

제곱근 > λ°˜μ˜¬λ¦Όκ°’μΌ 경우 2*반올림 

 


μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€. 참고둜 μž…λ ₯κ°’μ˜ λ²”μœ„κ°€ 2^31μ΄λ―€λ‘œ x, y의 μžλ£Œν˜•μ€ long long을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 

#include <iostream>
#include <cmath>

using namespace std;

int main(){
	cin.tie(0);
	int t;
	cin >> t;
	
	long long x, y;
	
	for(int i=0; i<t; i++){
		cin >> x >> y;
		double distance = y-x; // 두 지점 μ‚¬μ΄μ˜ 거리
		double dpow = sqrt(distance); // 거리의 제곱근
		int pow = round(sqrt(distance)); // 거리의 μ œκ³±κ·Όμ„ 반올림
		
		if(dpow <= pow) cout << pow * 2 - 1 << "\n"; 
		else cout << pow * 2 << "\n"; 
	}
		
	return 0;
}

 

 

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main() {
    int num;
    scanf("%d",&num);
    for(int i = 0; i < num; i++)
    {
        long long x,y;
        long long move,max = 0;
        cin >>x>>y;
        while(max*max <= y-x)
            max++;
        max--;
        move = 2*max -1;
        long long rem = y-x - max*max;
        rem = (long long)ceil((double)rem / (double)max);
        move += rem;
        printf("%lld\n",move);
    }
}

https://cryptosalamander.tistory.com/25

 

[λ°±μ€€ / BOJ] - 1011번 Fly me to the Alpha Centauri C++ 풀이

λ°±μ€€ - λ‹¨κ³„λ³„λ‘œ 풀어보기 [1011] https://www.acmicpc.net/problem/1011 문제 처음 이동 ν•  λ•Œ -1, 0 , 1 을 이동할 수 μžˆλŠ” μš°μ£Όμ„ μ€, 항상 kκ΄‘λ…„ μ΄λ™μ‹œλ§ˆλ‹€ k-1, k, k+1 κ΄‘λ…„λ§ŒνΌλ§Œ λ‹€μ‹œ 이동할 수 μžˆλ‹€. x..

cryptosalamander.tistory.com

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

 

[λ°±μ€€ μ•Œκ³ λ¦¬μ¦˜] 1011번 : Fly me to the Alpha Centauri

문제 1011번 : Fly me to the Alpha Centauri 1011번: Fly me to the Alpha Centauri μš°ν˜„μ΄λŠ” μ–΄λ¦° μ‹œμ ˆ, 지ꡬ μ™Έμ˜ λ‹€λ₯Έ ν–‰μ„±μ—μ„œλ„ 인λ₯˜λ“€μ΄ μ‚΄μ•„κ°ˆ 수 μžˆλŠ” λ―Έλž˜κ°€ 였리라 λ―Ώμ—ˆλ‹€. 그리고 κ·Έκ°€ 지ꡬ라..

jaynamm.tistory.com

두 λΆ„μ˜ 풀이와 μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•˜μ˜€λ‹€.