λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/goorm

[ꡬ름LEVEL] μ„ λ³„μ§„λ£Œμ†Œ

by dar0m! 2020. 5. 2.
λ‚œμ΄λ„ μ •λ‹΅λ₯ 
β˜…β˜…β˜… -%

프리미엄 μ•Œκ³ λ¦¬μ¦˜ μœ„ν΄λ¦¬ λΉ„νƒ€μ•Œκ³  μ‹œμ¦Œ3 4μ›” 1μ£Όμ°¨

 

goorm

ꡬ름은 ν΄λΌμš°λ“œ κΈ°μˆ μ„ μ΄μš©ν•˜μ—¬ λˆ„κ΅¬λ‚˜ 코딩을 배우고, μ‹€λ ₯을 ν‰κ°€ν•˜κ³ , μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  수 μžˆλŠ” ν΄λΌμš°λ“œ μ†Œν”„νŠΈμ›¨μ–΄ μƒνƒœκ³„μž…λ‹ˆλ‹€.

www.goorm.io

문제

 

ν•΄κ²°

key point, Nλͺ…μ˜ μ‚¬λžŒμ„ μ§„λ£Œν•˜κΈ° μœ„ν•΄ κ±Έλ¦¬λŠ” μ΅œμ†Œ μ‹œκ°„μ„ μ΄λΆ„νƒμƒ‰ν•˜μž!
  1. k개의 μ§„λ£Œμ‹€μ—μ„œ ν™˜μžλ₯Ό μ§„λ£Œν•˜κΈ° μœ„ν•΄ κ±Έλ¦¬λŠ” μ‹œκ°„μ΄ 각각 주어진닀. → a[k]
  2. 그리고 μ§„λ£Œμ‹€μ—μ„œ κ±Έλ¦¬λŠ” μ‹œκ°„μ„ 가지고 전체 μ‹œκ°„μ„ μ•Œμ•„λ‚΄μ•Όν•œλ‹€.
  3. ν•˜μ§€λ§Œ μš°λ¦¬λŠ” 거꾸둜, μž„μ˜μ˜ μ‹œκ°„μ΄ κ±Έλ¦°λ‹€κ³  κ°€μ •ν•˜κ³  λͺ‡ λͺ…을 μΉ˜λ£Œν•  수 μžˆλŠ”μ§€ ꡬ할 것이닀.
    1. 각 μ§„λ£Œμ‹€μ—μ„œ μΉ˜λ£Œν•  수 μžˆλŠ” ν™˜μžμ˜ μˆ˜λŠ” (전체 μ‹œκ°„)/a[k] 이닀.
  4. μž„μ˜μ˜ μ‹œκ°„μ—μ„œ 각 μ§„λ£Œμ‹€μ—μ„œ μΉ˜λ£Œν•  수 μžˆλŠ” ν™˜μžμ˜ 수λ₯Ό λͺ¨λ‘ λ”ν•œ 값이 N보닀 ν¬κ±°λ‚˜ κ°™λ‹€λ©΄ μ΅œμ†Œ μ‹œκ°„μ„ ꡬ해야 ν•˜λ―€λ‘œ 더 μž‘μ€ μ‹œκ°„ λ‚΄μ—μ„œ Nλͺ… μ΄μƒμ˜ ν™˜μžλ₯Ό μΉ˜λ£Œν•  수 μžˆλŠ”μ§€ νƒμƒ‰ν•΄λ΄μ•Όν•œλ‹€.
  5. κ·Έλž˜μ„œ μš°λ¦¬λŠ” μ΅œμ†Œμ™€ μ΅œλŒ€λ₯Ό 각각 l(left)κ³Ό r(right)둜 작고 이뢄탐색을 μ§„ν–‰ν•΄μ„œ
  6. ν•΄λ‹Ή μ‹œκ°„μ— μ§„λ£Œν•  수 μžˆλŠ” ν™˜μžμ˜ 수λ₯Ό 맀번 κ΅¬ν•΄μ„œ Nκ³Ό λΉ„κ΅ν–ˆλ‹€.
  7. ν•΄λ‹Ή μ‹œκ°„μ— μ§„λ£Œν•  수 μžˆλŠ” ν™˜μžμ˜ μˆ˜λŠ” ν•΄λ‹Ήμ‹œκ°„μ„ μ§„λ£Œμ†Œμ—μ„œ κ±Έλ¦¬λŠ” μ‹œκ°„μœΌλ‘œ λ‚˜λˆˆ 값이기 λ•Œλ¬Έμ— μ΅œλŒ€ 10얡이 될 수 있고, k개의 μ§„λ£Œμ‹€μ΄ μžˆμ–΄μ„œ 10μ–΅*kκ°€ 될 수 μžˆμ–΄ intν˜•μ˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„œκΈ° λ•Œλ¬Έμ— long long ν˜•μœΌλ‘œ μ§€μ •ν•΄μ£Όμ—ˆλ‹€.
  8. λ°˜λ³΅λ¬Έμ„ 계속 λŒλ‹€κ°€ l이 rκ³Ό κ°™κ±°λ‚˜ 더 μ»€μ§€λŠ” 상황이 되면 μ’…λ£Œν•œλ‹€.

μ½”λ“œ

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
28
29
#include <cstdio>
using namespace std;
typedef long long ll;
int n, k, ans, arr[100005];
ll chk(int mid) {
    ll res = 0;
    for (int i = 0; i < k; i++) {
        res += (mid / arr[i]);
    }
    return res;
}
int main() {
    scanf("%d%d"&n, &k);
    for (int i = 0; i < k; i++) {
        scanf("%d"&arr[i]);
    }
    int l = 0, r = 1e9;
    while (l <= r) {
        int mid = (l + r) / 2;
        ll res = chk(mid);
        if (res >= n) {
            r = mid - 1;
            ans = mid;
        }
        else l = mid + 1;
    }
    printf("%d", ans);
    return 0;
}
cs

 

λŒ“κΈ€