Algorithm 문제/ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

[c++] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ :: 탑 (문제 풀이, μ½”λ“œ)

희은w 2020. 7. 26. 11:16

탑

https://programmers.co.kr/learn/courses/30/lessons/42588?language=cpp

 

μ½”λ“œ

#include <string>
#include <vector>
#include <stack>

using namespace std;

vector<int> solution(vector<int> heights) {
    int heights_len = heights.size();
    vector<int> answer(heights_len);
    stack<int> stk; // index, key

    for (int i = heights_len - 1; i>0; i--) {
        if (heights[i - 1] > heights[i]) {
            answer[i] = i;

            // stack
            while (stk.size() != 0) {
                auto tmp = stk.top();
                if (heights[tmp] < heights[i - 1]) {
                    answer[tmp] = i;
                    stk.pop();
                }
                else
                    break;
            }
        }
        else {
            stk.push(i);
        }
    }

    int len = stk.size();
    while (len-- > 0) {
        auto tmp = stk.top();
        stk.pop();
        answer[tmp] = 0;
    }

    return answer;
}

 

μ„€λͺ…

 νƒ‘은 μžμ‹ λ³΄λ‹€ 크고, μ•žμ— μžˆλŠ” νƒ‘μ—κ²Œλ§Œ μ‹ ν˜Έλ₯Ό 전솑할 수 μžˆλ‹€. λ’€μͺ½ 탑뢀터 μ•žμͺ½ νƒ‘μœΌλ‘œ κ°€λ©΄μ„œ μ–΄λ–€ νƒ‘μ—κ²Œ μ‹ ν˜Έλ₯Ό 전솑할 수 μžˆλŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

 

 5번 탑뢀터 μ‚΄νŽ΄λ³΄μž. μš°λ¦¬λŠ” 그림을 μ§κ΄€μ μœΌλ‘œ λ³΄μ•˜μ„ λ•Œ, 5번 탑 μ•žμ— μžˆλŠ” 탑듀이 λͺ¨λ‘ 5번 탑보닀 μž‘μ€ 것을 μ•Œ 수 μžˆλ‹€. λ”°λΌμ„œ 5번 탑은 μ–΄λ–€ νƒ‘μ—κ²Œλ„ μ‹ ν˜Έλ₯Ό 보내지 λͺ»ν•œλ‹€. 그림을 그렀놓고 보면 μ†μ‰½κ²Œ 이 사싀을 μ•Œ 수 μžˆμ§€λ§Œ, 사싀 ν”„λ‘œκ·Έλž¨ μƒμ—μ„œλŠ” μ•žμ„  λͺ¨λ“  νƒ‘μ˜ 높이λ₯Ό ν˜„μž¬ νƒ‘μ˜ 높이와 λΉ„κ΅ν•΄λ³΄λŠ” 것과 κ°™λ‹€. μ΄λŸ¬ν•œ 방식은 κ°„λ‹¨ν•˜μ—¬ μ‹€μ œλ‘œ heightsκ°€ 100μ΄ν•˜μΈ ν•΄λ‹Ή λ¬Έμ œμ—μ„œ 10^4 만큼의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°€μ§„λ‹€.

 

 ν•˜μ§€λ§Œ 보닀 κ°„λ‹¨ν•œ 방법을 μ°Ύμ•„λ³΄μž.

 ν•˜λ‚˜μ”© λŠμ–΄μ„œ κ·œμΉ™μ„ 찾아보면, 두 개의 탑이 μžˆμ„ λ•Œ μ•žμ„  탑이 λ’€μ˜ 탑보닀 μž‘κ±°λ‚˜ κ°™μœΌλ©΄ λ’€μ˜ 탑은 μ•žμ„  νƒ‘μ—κ²Œ μ‹ ν˜Έλ₯Ό 전솑할 수 μ—†λ‹€. λ°˜λŒ€λ‘œ μ•žμ„  탑이 더 크닀면 λ’€μ˜ 탑은 μ•žμ„  νƒ‘μ—κ²Œ μ‹ ν˜Έλ₯Ό 전솑할 수 μžˆλ‹€.

 

 μ΄ κ·œμΉ™μ„ μ΄μš©ν•΄μ„œ μ—¬λŸ¬ 탑이 μ‘΄μž¬ν•  λ•Œλ₯Ό μ‚΄νŽ΄λ³΄μž.

 λ’€μ—μ„œλΆ€ν„° μ•žμœΌλ‘œ μ˜€λ©΄μ„œ μ‚΄νŽ΄λ³΄λ©΄, 4번 탑은 3번 탑보닀 ν¬κ±°λ‚˜ 같은 쑰건을 λ§Œμ‘±ν•˜λ―€λ‘œ 3번 탑에 μ‹ ν˜Έλ₯Ό 전솑할 수 μ—†λ‹€. ν•˜μ§€λ§Œ 2번 νƒ‘λ³΄λ‹€λŠ” μž‘μœΌλ―€λ‘œ 2번 탑에 μ‹ ν˜Έλ₯Ό 전솑할 수 μžˆλ‹€. 이미 2번 탑에 μ‹ ν˜Έλ₯Ό μ „μ†‘ν–ˆμœΌλ―€λ‘œ 1번 νƒ‘κ³Όμ˜ κ΄€κ³„λŠ” μ‚΄νŽ΄λ³Ό ν•„μš”κ°€ μ—†λ‹€.

 

 μ΄λ ‡κ²Œ 탑이 μ—¬λŸ¬κ°œμΌ λ•ŒλŠ” μ•žμ„  νƒ‘κ³Όμ˜ 1:1 관계λ₯Ό μ‹ ν˜Έλ₯Ό 전솑할 수 μžˆλŠ” νƒ‘κΉŒμ§€λ§Œ μ‘°μ‚¬ν•˜λ©΄ λœλ‹€. λ‹€λ§Œ ν˜„μž¬μ˜ 방법은 (4,3)쑰사 => (4,2)쑰사 => (3,2) 쑰사 => (2,1) 쑰사 의 μˆœμ„œμ΄λ‹€. 이λ₯Ό μŠ€νƒμ„ μ΄μš©ν•΄μ„œ μ•½κ°„ μˆœμ„œλ₯Ό 바꿔보면 훨씬 κ°„νŽΈν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

 ν˜„μž¬ 탑보닀 ν•œμΉΈ μ•žμ— μžˆλŠ” 탑이 μž‘κ±°λ‚˜ κ°™μœΌλ©΄ μŠ€νƒμ— μ €μž₯ν•˜κ³ , κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ 정닡배열에 닡을 μ €μž₯ν•˜κΈ°λ‘œ ν•˜μž. κ·Έλ ‡λ‹€λ©΄ μœ„μ˜ κ·Έλ¦Όμ—μ„œλŠ” 4κ°€ μŠ€νƒμ— μ €μž₯λ˜μ–΄μžˆμ„ 것이닀. 3번 νƒ‘μœΌλ‘œ λ„˜μ–΄κ°€μ„œ λ˜‘κ°™μ΄ 비ꡐ해본닀면 2번 탑은 3번 탑보닀 ν¬λ―€λ‘œ 3번 νƒ‘μ˜ 정닡은 2이닀. 이 λ•Œ, μŠ€νƒμ— λ“€μ–΄μžˆλ˜ 4번 탑과도 비ꡐλ₯Ό ν•΄λ³Έλ‹€. 2번 탑이 4번 탑보닀 ν¬λ―€λ‘œ 4번 νƒ‘μ˜ 정닡도 2이닀. (4,3)쑰사 => (3,2)쑰사 => (4,2)쑰사 => (2,1)쑰사 순으둜 λ°”κΎΈλŠ” 것이닀.

 

μ΄λ ‡κ²Œ μŠ€νƒμ„ μ΄μš©ν•˜λŠ” 방법은 λ‹€μŒκ³Ό 같은 μƒν™©μ—μ„œ μœ λ¦¬ν•˜λ‹€.

 μŠ€νƒμ„ μ΄μš©ν•˜μ§€ μ•ŠλŠ” λ°©λ²•μ΄μ—ˆλ‹€λ©΄, (6,5)=>(6,4)=>(6,3)=>(6,2)λ₯Ό μ‘°μ‚¬ν•΄μ•Όν•˜λŠ” 것을 μŠ€νƒ μ‚¬μš© ν›„, (6,5)=>(6,2)둜 쀄여주기 λ•Œλ¬Έμ΄λ‹€. μ‹€μ œλ‘œ 세어보면 11번의 λΉ„κ΅μ—μ„œ 8번의 λΉ„κ΅λ‘œ 쀄어든 것을 μ•Œ 수 μžˆλ‹€.

λ°˜μ‘ν˜•