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

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 큰 수 λ§Œλ“€κΈ° - C++ λ³Έλ¬Έ

μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 큰 수 λ§Œλ“€κΈ° - C++

.23 2024. 4. 11. 17:21
문제

μ–΄λ–€ μˆ«μžμ—μ„œ k개의 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” κ°€μž₯ 큰 숫자λ₯Ό κ΅¬ν•˜λ € ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 숫자 1924μ—μ„œ 수 두 개λ₯Ό μ œκ±°ν•˜λ©΄ [19, 12, 14, 92, 94, 24] λ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 쀑 κ°€μž₯ 큰 μˆ«μžλŠ” 94 μž…λ‹ˆλ‹€.

λ¬Έμžμ—΄ ν˜•μ‹μœΌλ‘œ 숫자 number와 μ œκ±°ν•  수의 개수 kκ°€ solution ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. numberμ—μ„œ k 개의 수λ₯Ό μ œκ±°ν–ˆμ„ λ•Œ λ§Œλ“€ 수 μžˆλŠ” 수 쀑 κ°€μž₯ 큰 숫자λ₯Ό λ¬Έμžμ—΄ ν˜•νƒœλ‘œ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

 

μ œν•œ 쑰건
  • numberλŠ” 2자리 이상, 1,000,000자리 μ΄ν•˜μΈ μˆ«μžμž…λ‹ˆλ‹€.
  • kλŠ” 1 이상 number의 자릿수 λ―Έλ§ŒμΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
μž…μΆœλ ₯ 예
number k return
"1924" 2 "94"
"1231234" 3 "3234"
"4177252841" 4 "775841"

 


그리디λ₯Ό μ΄μš©ν•˜μ—¬ ν’€ 수 μžˆλŠ” 문제.

 

k개만큼 μ‚­μ œν•˜μ˜€μ„ λ•Œ κ°€μž₯ 큰 μˆ˜μ—¬μ•Ό ν•˜λ―€λ‘œ, μ•žμ—μ„œλΆ€ν„° μ§€μ›Œλ‚˜κ°”μ„ λ•Œ κ°€μž₯ 큰 (length - k) 자리수의 숫자λ₯Ό κ΅¬ν•œλ‹€.

 

λ”°λΌμ„œ numberμ—μ„œ (0 ~ k) 만큼의 숫자 쀑 κ°€μž₯ μ΅œλŒ“κ°’μ„ μ°Ύμ•„ answer에 λ”ν•˜κ³ , μ΅œλŒ“κ°’μ΄ μœ„μΉ˜ν•œ μœ„μΉ˜λ₯Ό cursor에 μ €μž₯ν•œλ‹€.

cursor μ΄μ „κΉŒμ§€ 숫자λ₯Ό μ œκ±°ν•˜κ²Œ λ˜λ―€λ‘œ kμ—μ„œλŠ” cursor만큼 λΉΌμ£Όκ³ , numberμ—μ„œλ„ λ³Έ 숫자만큼 μ§€μ›Œμ€€ ν›„ kκ°€ 0이 될 λ•Œ κΉŒμ§€ λ°˜λ³΅ν•΄μ€€λ‹€.

κ·Έ ν›„, kκ°€ 0이 λ˜μ—ˆμœΌλ©΄ 더이상 μ§€μšΈ 수 μžˆλŠ” μˆ«μžκ°€ μ—†μœΌλ―€λ‘œ λ‚¨μ•„μžˆλŠ” 숫자λ₯Ό λͺ¨λ‘ 더해쀀닀.

그림으둜 ν‘œν˜„ν•˜λ©΄ 이정도 될듯??

 

근데 μ΄λ ‡κ²Œλ§Œ ν•˜λ©΄ 333222111 μ΄λΌλ˜κ°€.. 11111111κ³Ό 같이 μˆ«μžκ°€ μž‘μ•„μ§€κΈ°λ§Œ ν•˜κ±°λ‚˜ 같은 μˆ˜κ°€ λ°˜λ³΅λ˜λŠ” 경우 닡이 μ•ˆλ‚˜μ˜¨λ‹€..

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ’…λ£Œ 쑰건을 κΌ­ λ‹¬μ•„μ€˜μ•Όν•œλ‹€.

 

κ·Έλ¦¬λ””λž‘ μΉœν•΄μ§€κΈ° μ–΄λ ΅λ‹€..

 

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

using namespace std;

string solution(string number, int k) {
    string answer = "";

    int len = number.length();
    
    for(int j = 0; j < len; j++) {
        if(answer.length() >= (len - k)) break;
        
        int cursor = 0;
        char temp = number[cursor];

        for(int i = 0; i <= k; i++) {
            if(temp < number[i]) {
                temp = number[i];
                cursor = i;
            }
        }
        answer += temp;
        number.erase(0, cursor + 1);

        k -= cursor;

        if(k <= 0) {
            answer += number;
            break;
        }
    }
    
    return answer;
}
Comments