𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 1756번: ν”Όμž κ΅½κΈ° - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 1756번: ν”Όμž κ΅½κΈ° - C++

.23 2022. 1. 14. 15:14
문제

μ›”λ“œν”Όμž 원주 μ§€μ μ—μ„œ N개의 ν”Όμž λ°˜μ£½μ„ μ˜€λΈμ— λ„£κ³  ꡬ우렀고 ν•œλ‹€. 그런데, μ›”λ“œν”Όμžμ—μ„œ λ§Œλ“œλŠ” ν”Όμž λ°˜μ£½μ€ 지름이 μ œκ°κ°μ΄λ‹€. κ·ΈλŸ°κ°€ν•˜λ©΄, μ›”λ“œν”Όμžμ—μ„œ μ‚¬μš©ν•˜λŠ” 였븐의 λͺ¨μ–‘도 λͺΉμ‹œ μ˜€λ¬˜ν•˜λ‹€. 이 μ˜€λΈμ€ κΉŠμ€ κ΄€μ²˜λŸΌ μƒκ²ΌλŠ”λ°, κ΄€μ˜ 지름이 κΉŠμ΄μ— 따라 λ“€μ­‰λ‚ μ­‰ν•˜κ²Œ λ³€ν•œλ‹€. μ•„λž˜λŠ” 였븐의 단면 μ˜ˆμ‹œμ΄λ‹€.

ν”Όμž λ°˜μ£½μ€ μ™„μ„±λ˜λŠ” μˆœμ„œλŒ€λ‘œ μ˜€λΈμ— λ“€μ–΄κ°„λ‹€. μ΄λ ‡κ²Œ N개의 ν”Όμžκ°€ μ˜€λΈμ— λͺ¨λ‘ λ“€μ–΄κ°€κ³  λ‚˜λ©΄, 맨 μœ„μ˜ ν”Όμžκ°€ μ–Όλ§ˆλ‚˜ 깊이 λ“€μ–΄κ°€ μžˆλŠ”μ§€κ°€ κΆκΈˆν•˜λ‹€. 이λ₯Ό μ•Œμ•„λ‚΄λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 였븐의 깊이 D와 ν”Όμž 반죽의 개수 N이 곡백을 사이에 두고 주어진닀. (1 ≤ D, N ≤ 300,000) λ‘˜μ§Έ μ€„μ—λŠ” 였븐의 μ΅œμƒλ‹¨λΆ€ν„° μ‹œμž‘ν•˜μ—¬ κΉŠμ΄μ— λ”°λ₯Έ 였븐의 지름이 μ°¨λ‘€λŒ€λ‘œ 주어진닀. μ…‹μ§Έ μ€„μ—λŠ” ν”Όμž 반죽이 μ™„μ„±λ˜λŠ” μˆœμ„œλŒ€λ‘œ, κ·Έ 각각의 지름이 주어진닀. 였븐의 μ§€λ¦„μ΄λ‚˜ ν”Όμž 반죽의 지름은 10μ–΅ μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

 

좜λ ₯

첫째 쀄에, λ§ˆμ§€λ§‰ ν”Όμž 반죽의 μœ„μΉ˜λ₯Ό 좜λ ₯ν•œλ‹€. 였븐의 μ΅œμƒλ‹¨μ΄ 1이고, μ΅œν•˜λ‹¨ κ°€μž₯ κΉŠμ€ 곳이 D이 λœλ‹€. λ§Œμ•½ ν”Όμžκ°€ λͺ¨λ‘ μ˜€λΈμ— 듀어가지 μ•ŠλŠ”λ‹€λ©΄, 0을 좜λ ₯ν•œλ‹€.


별거 μ•„λ‹ˆλΌ μƒκ°ν–ˆλŠ”λ° κ³¨λ“œ 5μΈλ°λŠ” μ΄μœ κ°€ 있던 문제.. 아무 생각 없이 이쀑 for문을 μ‚¬μš©ν•΄μ„œ μ‰½κ²Œ ν’€λ €κ³  ν•˜λ©΄ 2초의 λ„‰λ„‰ν•œ μ‹œκ°„μž„μ—λ„ D, N의 숫자 λ²”μœ„λ•Œλ¬Έμ— μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚œλ‹€.

 

μ΄λŸ°μ‹μœΌλ‘œ νžŒνŠΈκ°€ μ£Όμ–΄μ§€λŠ”λ°, μ—¬κΈ°μ„œ 생각해야 될 점은 아무리 지름이 6인 ꡬ간이 μ‘΄μž¬ν•˜μ—¬λ„, μ΅œμƒλ‹¨μ˜ 지름이 5이면 지름이 6 μ΄μƒμ˜ ν”ΌμžλŠ” λ“€μ–΄κ°ˆ 수 μ—†λ‹€λŠ” 것이닀. λ”°λΌμ„œ 지름이 μ’μ•„μ§€λŠ” λŒ€λ‘œ μ•„λž˜ 사진과 같은 ꡬ쑰의 였븐이라고 생각해쀀 λ’€, μ΅œν•˜λ‹¨λΆ€ν„° ν˜„μž¬ ν”Όμžμ˜ 지름 크기와 비ꡐ해쀀닀.

μ΄λΆ„νƒμƒ‰μœΌλ‘œ ν‘ΈλŠ” 방법도 μžˆμœΌλ‚˜, (잘 λͺ¨λ₯΄λŠ” κ΄€κ³„λ‘œγ… γ… )κ°„λ‹¨ν•˜κ²Œ O(N) λ°©μ‹μœΌλ‘œλ§Œ ν’€μ—ˆλ‹€.

 

μ½”λ“œ
#include <cstdio>
#include <vector>

using namespace std;

int main(void) {
    int D, N;
    scanf("%d %d", &D, &N);

    vector<int> oven(D);
    vector<int> pizza(N);
    for(int i = 0; i < D; i++) {
        scanf("%d", &oven[i]);
        if(i != 0 && oven[i - 1] < oven[i]) oven[i] = oven[i - 1];
    }

    for(int i = 0; i < N; i++) {
        scanf("%d", &pizza[i]);
    }

    int count = 0;
    for(int i = D - 1; i >= 0; i--) {
        if(pizza[count] <= oven[i]) count++;
        
        if(count == N) {
            printf("%d\n", i + 1);
            return 0;
        }
    }

    printf("0\n");
    return 0;
}
Comments