μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€

[ λ°±μ€€ / BOJ 17451 ] 평행 우주 ( μžλ°” / JAVA )

KIMHYEYUN 2021. 10. 21. 00:17
λ°˜μ‘ν˜•

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

 

17451번: 평행 우주

ν–‰μ„± 1에 κ°€κΈ° μœ„ν•΄ ν•„μš”ν•œ 것보닀 μ„Έ 배의 μ†λ„λ‘œ, ν–‰μ„± 2의 경우 두 배의 μ†λ„λ‘œ μ΄λ™ν•˜λ©΄, μ§€κ΅¬μ—μ„œλŠ” 900의 μ†λ„λ§Œ μŒ“μœΌλ©΄ λœλ‹€.

www.acmicpc.net

 

문제


μ„œκΈ° 2XXXλ…„, 지ꡬ가 μ†Œν–‰μ„±κ³Ό μΆ©λŒν•  μœ„κΈ°μ— μ²˜ν–ˆλ‹€! λ˜‘λ˜‘ν•œ κ³Όν•™μž ν‚€νŒŒλŠ” 평행 우주λ₯Ό λˆ„λΉ„λ©° 지ꡬλ₯Ό λŒ€μ‹ ν•  행성을 μ°ΎλŠ” λ§‰μ€‘ν•œ μž„λ¬΄λ₯Ό 맑게 λ˜μ—ˆλ‹€.

μš°λ¦¬λŠ” ν˜„μž¬ 지ꡬ(=ν–‰μ„± 0)에 μžˆλ‹€. μ—¬λŸ¬ μš”μΈμ„ κ³ λ €ν•œ κ²°κ³Ό, ν–‰μ„± 1, ν–‰μ„± 2, …, ν–‰μ„± (n-1)을 μˆœμ„œλŒ€λ‘œ ν™•μΈν•˜κ³  지ꡬ(=ν–‰μ„± n)에 λŒμ•„μ˜€λŠ” 것이 λΉ„μš©μƒ μ΅œμ μž„μ„ μ•Œμ•„λƒˆλ‹€. λͺ¨λ“  μ •μˆ˜ \(1 \leq i < n\)에 λŒ€ν•΄, ν–‰μ„± i은 지ꡬ가 μ•„λ‹ˆλ‹€.

μ§€κ΅¬μ—λŠ” "μ΄ˆκ³ μ† κ±·κΈ° 기계"λΌλŠ”, 속도λ₯Ό μ›ν•˜λŠ” 만큼 올릴 수 μžˆλŠ” νŠΉμˆ˜ν•œ μž₯μΉ˜κ°€ μžˆλ‹€. 지ꡬλ₯Ό λ²—μ–΄λ‚˜λ©΄ 속도λ₯Ό λ–¨μ–΄λœ¨λ¦΄ 수 μžˆμ„ 뿐 높일 μˆ˜λŠ” μ—†λ‹€.

λ‹€μŒ 지역에 κ°€κΈ° μœ„ν•΄μ„œλŠ” μ›μΉ™μ μœΌλ‘œλŠ” ν•„μš”ν•œ 속도λ₯Ό μ •ν™•νžˆ λ§žμΆ°μ•Ό ν•˜μ§€λ§Œ, λ‹€ν–‰νžˆλ„ 평행 μš°μ£ΌλŠ” μΌμ •ν•œ 간격을 두고 있기 λ•Œλ¬Έμ— ν•„μš”ν•œ μ†λ„μ˜ μ–‘μ˜ μ •μˆ˜ λ°°λ‘œλ„ λ‹€μŒ μ§€μ—­μœΌλ‘œ 이동할 수 μžˆλ‹€. λ˜ν•œ, μΆ©λΆ„νžˆ λΉ λ₯Έ μ†λ„λ‘œ 이동 쀑이며, μ§€κ΅¬μ˜ λŒ€μ²΄ ν–‰μ„±μœΌλ‘œ μ ν•©ν•œμ§€ μ•„λ‹Œμ§€λŠ” λ„μ°©ν•œ λ’€ λ°”λ‘œ μ•Œ 수 있기 λ•Œλ¬Έμ— μ–΄λ–€ ν–‰μ„±μ—μ„œλŠ” λ„λ‹¬ν•œ λ’€ 속도λ₯Ό μœ μ§€ν•œ 채 λ‹€μŒ ν–‰μ„±μœΌλ‘œ 이동할 μˆ˜λ„ μžˆλ‹€.

λͺ¨λ“  \(1 \leq \leq n\)에 λŒ€ν•΄, ν–‰μ„± (i-1)μ—μ„œ ν–‰μ„± i둜 μ΄λ™ν•˜λŠ” 데 ν•„μš”ν•œ (μ΅œμ†Œ) 속도 viκ°€ μ£Όμ–΄μ§„λ‹€. μ§€κ΅¬μ—μ„œ μ˜¬λ €μ•Ό ν•˜λŠ” 속도λ₯Ό μ΅œμ†Œν™”ν•˜μ‹œμ˜€. 

μž…λ ₯


첫째 쀄에 n \(1 \leq n \leq 3.105\)이 μ£Όμ–΄μ§„λ‹€.

λ‘˜μ§Έ 쀄에 n개의 μ •μˆ˜ v1, v2, …, vn이 곡백을 사이에 두고 μ£Όμ–΄μ§„λ‹€. λͺ¨λ“  μ •μˆ˜ \(1 \leq i \leq n\)에 λŒ€ν•΄ \(1 \leq vi \leq 109\)을 λ§Œμ‘±ν•œλ‹€.

좜λ ₯


수 ν•˜λ‚˜λ₯Ό 좜λ ₯ν•œλ‹€. 이 μˆ˜λŠ” μ§€κ΅¬μ—μ„œ μ˜¬λ €μ•Ό ν•˜λŠ” μ†λ„μ˜ μ΅œμ†Ÿκ°’μ΄λ‹€.

풀이


Greedy ν•˜κ²Œ ν•΄κ²°~

맨 λ§ˆμ§€λ§‰ ν–‰μ„±λΆ€ν„° μ§„ν–‰ν•œλ‹€ 🀟

μ†λ„μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λ©΄ 되기 λ•Œλ¬Έμ— λ§ˆμ§€λ§‰ ν–‰μ„±μ—μ„œλŠ” κ·Έ ν–‰μ„±μ˜ 속도와 같은 값이면 μΆ©λΆ„ν•˜κΈ° λ•Œλ¬Έβ€ΌοΈ

λ’€μ—μ„œλΆ€ν„° μ§„ν–‰ν•˜λ©΄μ„œ,

1️⃣ ν˜„μž¬μ˜ 속도 (velocity) κ°€ i ν–‰μ„±μ˜ 속도보닀 μž‘μœΌλ©΄ πŸ‘‰ velocity = i ν–‰μ„±μ˜ 속도

2️⃣ ν˜„μž¬μ˜ 속도 (velocity) κ°€ i ν–‰μ„±μ˜ 속도보닀 크면 πŸ‘‰ 2κ°€μ§€ κ²½μš°κ°€ λ‚˜μ˜¨λ‹€

  1. ν˜„μž¬μ˜ 속도가 i ν–‰μ„±μ˜ μ†λ„μ˜ μ–‘μ˜ 배수이면 πŸ‘‰ 상관 γ„΄ μ§„ν–‰ ‼️
  2. ν˜„μž¬μ˜ 속도가 i ν–‰μ„±μ˜ μ†λ„μ˜ μ–‘μ˜ λ°°μˆ˜κ°€ μ•„λ‹ˆλΌλ©΄ πŸ‘‰ velocity 값보닀 크도둝 ν•˜λ©΄μ„œ i ν–‰μ„±μ˜ μ†λ„μ˜ μ–‘μ˜ 배수둜 λ§Œλ“€μ–΄ 쀀닀‼️

μ½”λ“œ


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

public class Main_BOJ_17451_ν‰ν–‰μš°μ£Ό {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer stringTokenizer;

        int n = Integer.parseInt(br.readLine());

        long[] planet = new long[n];
        stringTokenizer = new StringTokenizer(br.readLine());
        for(int i = 0;i < n ; i++){
            planet[i] = Long.parseLong(stringTokenizer.nextToken());
        }

        long velocity = planet[n-1];
        for(int i = n-2; i >= 0; i--){
            if(velocity < planet[i])
                velocity = planet[i];
            else if(planet[i] < velocity && velocity%planet[i] != 0)
                velocity = ((velocity / planet[i]) + 1) * planet[i];
        }
        
        System.out.println(velocity);
    }
}

 

728x90
λ°˜μ‘ν˜•