πŸ“¦ Changgo/πŸ’  BOJ

[BOJ][C++] λ°±μ€€ 1485번: κ°€λ‘œμˆ˜

선달 2024. 3. 13. 03:10
λ°˜μ‘ν˜•

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

 

2485번: κ°€λ‘œμˆ˜

첫째 μ€„μ—λŠ” 이미 심어져 μžˆλŠ” κ°€λ‘œμˆ˜μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•˜λ‚˜μ˜ μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€(3 ≤ N ≤ 100,000). λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 μ€„λ§ˆλ‹€ 심어져 μžˆλŠ” κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜κ°€ μ–‘μ˜ μ •μˆ˜λ‘œ μ£Όμ–΄μ§€λ©°, κ°€

www.acmicpc.net

 

문제

μ§μ„ μœΌλ‘œ λ˜μ–΄μžˆλŠ” λ„λ‘œμ˜ ν•œ νŽΈμ— κ°€λ‘œμˆ˜κ°€ μž„μ˜μ˜ κ°„κ²©μœΌλ‘œ μ‹¬μ–΄μ Έμžˆλ‹€. KOI μ‹œμ—μ„œλŠ” κ°€λ‘œμˆ˜λ“€μ΄ λͺ¨λ‘ 같은 간격이 λ˜λ„λ‘ κ°€λ‘œμˆ˜λ₯Ό μΆ”κ°€λ‘œ μ‹¬λŠ” 사업을 μΆ”μ§„ν•˜κ³  μžˆλ‹€. KOI μ‹œμ—μ„œλŠ” μ˜ˆμ‚°λ¬Έμ œλ‘œ κ°€λŠ₯ν•œ ν•œ κ°€μž₯ 적은 수의 λ‚˜λ¬΄λ₯Ό 심고 μ‹Άλ‹€.

νŽΈμ˜μƒ κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜λŠ” κΈ°μ€€μ μœΌλ‘œ λΆ€ν„° λ–¨μ–΄μ Έ μžˆλŠ” 거리둜 ν‘œν˜„λ˜λ©°, κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜λŠ” λͺ¨λ‘ μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

예λ₯Ό λ“€μ–΄, κ°€λ‘œμˆ˜κ°€ (1, 3, 7, 13)의 μœ„μΉ˜μ— μžˆλ‹€λ©΄ (5, 9, 11)의 μœ„μΉ˜μ— κ°€λ‘œμˆ˜λ₯Ό 더 μ‹¬μœΌλ©΄ λͺ¨λ“  κ°€λ‘œμˆ˜λ“€μ˜ 간격이 κ°™κ²Œ λœλ‹€. λ˜ν•œ, κ°€λ‘œμˆ˜κ°€ (2, 6, 12, 18)에 μžˆλ‹€λ©΄ (4, 8, 10, 14, 16)에 κ°€λ‘œμˆ˜λ₯Ό 더 심어야 ν•œλ‹€.

심어져 μžˆλŠ” κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜κ°€ μ£Όμ–΄μ§ˆ λ•Œ, λͺ¨λ“  κ°€λ‘œμˆ˜κ°€ 같은 간격이 λ˜λ„λ‘ μƒˆλ‘œ 심어야 ν•˜λŠ” κ°€λ‘œμˆ˜μ˜ μ΅œμ†Œμˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μΆ”κ°€λ˜λŠ” λ‚˜λ¬΄λŠ” 기쑴의 λ‚˜λ¬΄λ“€ μ‚¬μ΄μ—λ§Œ 심을 수 μžˆλ‹€.

μž…λ ₯

첫째 μ€„μ—λŠ” 이미 심어져 μžˆλŠ” κ°€λ‘œμˆ˜μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•˜λ‚˜μ˜ μ •μˆ˜ N이 μ£Όμ–΄μ§„λ‹€(3 ≤ N ≤ 100,000). λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 μ€„λ§ˆλ‹€ 심어져 μžˆλŠ” κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜κ°€ μ–‘μ˜ μ •μˆ˜λ‘œ μ£Όμ–΄μ§€λ©°, κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λŠ” 1,000,000,000 μ΄ν•˜μ΄λ‹€. κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λŠ” λͺ¨λ‘ λ‹€λ₯΄κ³ , N개의 κ°€λ‘œμˆ˜λŠ” κΈ°μ€€μ μœΌλ‘œλΆ€ν„° λ–¨μ–΄μ§„ 거리가 κ°€κΉŒμš΄ μˆœμ„œλŒ€λ‘œ μ£Όμ–΄μ§„λ‹€.

좜λ ₯

λͺ¨λ“  κ°€λ‘œμˆ˜κ°€ 같은 간격이 λ˜λ„λ‘ μƒˆλ‘œ 심어야 ν•˜λŠ” κ°€λ‘œμˆ˜μ˜ μ΅œμ†Œμˆ˜λ₯Ό 첫 번째 쀄에 좜λ ₯ν•œλ‹€.

 

풀이

μž…λ ₯ 받은 κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜λ“€μ˜ 사이 값을 λ°°μ—΄λ‘œ μ €μž₯ν•œλ‹€

예λ₯Όλ“€μ–΄ κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜κ°€ 1,3,7,13 이 μ£Όμ–΄μ§€λ©΄

λ²‘ν„°μ—λŠ” 2,4,6 이 μ €μž₯λ˜λŠ” ν˜•νƒœ (각각 3-1, 7-3, 13-7)

 

(1)

벑터에 μžˆλŠ” λͺ¨λ“  μˆ˜λ“€μ˜ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•œλ‹€

gcd ν•¨μˆ˜λŠ” μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ„ μ΄μš©ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•œλ‹€.

μ΄λ•Œ, a>bλ₯Ό ν™•μ •ν•  수 μ—†μœΌλ―€λ‘œ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μˆœμ„œλ₯Ό μžλ™μœΌλ‘œ 지정해주도둝 ν–ˆλ‹€

 

(2)

벑터에 μžˆλŠ” 수 / 방금 κ΅¬ν•œ μ΅œλŒ€κ³΅μ•½μˆ˜ = ν•΄λ‹Ή 거리에 심어져야 ν•  κ°€λ‘œμˆ˜μ˜ 갯수 +1 이닀

예λ₯Όλ“€μ–΄ μœ„ μ˜ˆμ œμ—μ„œ μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 2κ°€ λ‚˜μ˜€λŠ”λ°,

1κ³Ό 3 μ‚¬μ΄λŠ” 거리가 2 μ΄λ―€λ‘œ 2/2=1 -> 사이에 0개 μ‹¬μŒ

3κ³Ό 7 μ‚¬μ΄λŠ” 거리가 4 μ΄λ―€λ‘œ 4/2=2 -> 사이에 1개 μ‹¬μŒ (5 μœ„μΉ˜)

7κ³Ό 13 μ‚¬μ΄λŠ” 거리가 6 μ΄λ―€λ‘œ 6/2=3 -> 사이에 2개 μ‹¬μŒ (9, 11 μœ„μΉ˜)

 

이제 κ·Έ 수λ₯Ό 더해주면 끝 !

 

μ½”λ“œ

#include <iostream>
#include <vector>

using namespace std;

// Greatest Common Divisor : μ΅œλŒ€κ³΅μ•½μˆ˜
int gcd(int a, int b) {
    if(a<b) { 
        int tmp = a;
        a = b;
        b = tmp;
    } // a와 b μˆœμ„œ μ•„λ¬΄λ ‡κ²Œλ‚˜ κ°€λŠ₯
    
    if(a%b != 0) {
        return gcd(b, a%b);
    }
    return b;
}

int main() {
    int n, before, cur;
    cin >> n;
    vector<int> v(n-1);
    cin >> before;
    for(int i=0; i<n-1; i++) {
        cin >> cur;
        v[i] = cur-before;
        before = cur;
    }

// (1)
    int totalGcd = v[0];
    for(int i=1; i<v.size(); i++) {
        totalGcd = gcd(v[i], totalGcd);
    }

// (2)
    int ans = 0;
    for(int i=0; i<v.size(); i++) {
        ans += v[i]/totalGcd - 1;
    }
    
    cout << ans;

    return 0;
}

 

 

 

λ°˜μ‘ν˜•