[Programmers] Lv2. [3μ°¨] nμ§„μˆ˜ κ²Œμž„ | C++

2023. 6. 21. 20:52ㆍCoding Test/Programmers

πŸ”—λ¬Έμ œ λ³΄λŸ¬κ°€κΈ°
 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

 

πŸ‘¨‍πŸ’»ν’€μ΄ κ³Όμ •

 

문제λ₯Ό 보자마자 무슨 동아리 μ‚¬λžŒλ“€μ΄ 이러고 λ…Έλ‚˜ μ‹Άμ—ˆμŠ΅λ‹ˆλ‹€. μΉ΄μΉ΄μ˜€μ— κ°€λŠ” μ‚¬λžŒλ“€μ€ λ‹€ μ €λŸ¬κ³  λ…ΈλŠ” κ±ΈκΉŒμš”?...

μ•„λ¬΄νŠΌ, μ €λŠ” 이 문제의 μ˜λ„λ₯Ό νŒŒμ•…ν•˜κΈ° νž˜λ“€μ–΄μ„œ μ‹œκ°„μ΄ μ’€ κ±Έλ ΈμŠ΅λ‹ˆλ‹€. λ‹€μŒ λ‚΄μš©μ„ μ΄ν•΄ν•˜λŠ” 데 μ’€ κ±Έλ Έμ–΄μš”.

 

ν•œ μ‚¬λžŒμ΄ λ§ν•˜λŠ” μˆ«μžλŠ” 무쑰건 ν•œ 자리 μˆ«μžλ‹€.
(μ‹­μ§„μˆ˜ "3" -> μ΄μ§„μˆ˜ "11"둜 λ³€ν™˜ν•˜λ”λΌλ„ ν•œ μ‚¬λžŒλ§ˆλ‹€ ν•œ μžλ¦¬μ”© μ½λŠ”λ‹€.)

 

 

예제인 n = 2, t = 4, m = 2, p = 1둜 λ³΄κ² μŠ΅λ‹ˆλ‹€. μš°μ„  μ‹­μ§„μˆ˜ 0λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 2μ§„μˆ˜λ‘œ λ³€ν™˜ν•΄λ³΄λ©΄ λ‹€μŒκ³Ό κ°™μ•„μš”.

// μ‹­μ§„μˆ˜ : 0 1  2   3    4    5    6    7  ...
// μ΄μ§„μˆ˜ : 0 1  10  11  100  101  110  111 ...  -> λ‹€ 이어뢙이면 011011100101110111

 

μ‹­μ§„μˆ˜ 0 ~7λ₯Ό λ³€ν™˜ν•œ μ΄μ§„μˆ˜λ“€μ„ λͺ¨λ‘ 이어뢙이면, "011011100101110111"μ΄λΌλŠ” λ¬Έμžμ—΄μ΄ λ‚˜μ˜΅λ‹ˆλ‹€. 그럼 μ—¬κΈ°μ„œ μ‚¬λžŒμ˜ 수(m)와 문제의 주인곡인 튜브의 순번(p), νŠœλΈŒκ°€ 말해야 ν•˜λŠ” 횟수(t)λ₯Ό 톡해 계산해야 ν•©λ‹ˆλ‹€.

 

pλŠ” μ΅œμ†Ÿκ°’μ΄ 1μ΄λ―€λ‘œ, λ¬Έμžμ—΄μ˜ 첫 μ‹œμž‘ 인덱슀인 0κ³Ό λ§žμΆ”λ €λ©΄ p - 1을 ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€. 튜브의 첫 μˆœλ²ˆμ€ p - 1μ΄λ―€λ‘œ, κ·Έ λ‹€μŒ μˆœλ²ˆμ€ 이전 튜브의 μˆœλ²ˆμ—μ„œ μ‚¬λžŒ 수(m)만큼 더해주면 λ©λ‹ˆλ‹€.

 

예제둜 μ˜ˆμ‹œλ₯Ό λ“€λ©΄, p = 1, m = 2, t = 4 μž…λ‹ˆλ‹€.

// p - 1 = 0, m = 2μ΄λ―€λ‘œ 첫 번째 순번인 0에 이어 mμ”© λ”ν•˜λ©΄ 0, 2, 4, 6이 λ‚˜μ˜΅λ‹ˆλ‹€.
// 0, 2, 4, 6에 ν•΄λ‹Ήν•˜λŠ” 인덱슀 μœ„μ— 'p' ν‘œμ‹œλ₯Ό ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

p p p p
011011100101110111

 // p1 = 0, p2 = 1, p3 = 1, p4 = 1 μ΄λ―€λ‘œ, λ‹€ 이어 뢙이면 정닡이 λ©λ‹ˆλ‹€.
 // answer = "0111"

 

이런 μ‹μœΌλ‘œ λ³€ν™˜ν•œ λ¬Έμžμ—΄μ—μ„œ νŠœλΈŒκ°€ 말해야 ν•  숫자의 인덱슀λ₯Ό 계산할 수 있고, λ§ν•œ νšŸμˆ˜κ°€ t번이 되면 정닡을 λ¦¬ν„΄ν•˜λ©΄ λ©λ‹ˆλ‹€. μ €λŠ” λ¬Έμ œμ—μ„œ 이 뢀뢄을 μ΄ν•΄ν•˜λŠ” 데 였래 κ±Έλ Έμ–΄μš”... 그럼, ν•΄μ•Ό ν•  일듀은 μ°¨λ‘€λŒ€λ‘œ λ‹€μŒκ³Ό κ°™μ•„μš”.

μ‹­μ§„μˆ˜λ₯Ό nμ§„μˆ˜λ‘œ λ³€ν™˜ν•˜λŠ” 과정은 μ‰¬μš°λ‹ˆ, 어렡지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

 

βœοΈμ†ŒμŠ€ μ½”λ“œ 및 κ²°κ³Ό

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
char digitSystems[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

string GetConvertedDigit(int num, int n) {
    string result;

    while (true) {
            int quotient = num / n;
            int remainder = num % n;
            result.push_back(digitSystems[remainder]);

            if (quotient == 0)
                break;
            num = quotient;
    }

    reverse(result.begin(), result.end());
    return result;
}


string solution(int n, int t, int m, int p) {
    string numbers = "";
    string answer = "";
    int currentNum = 0;
    int myTurnCount = 0;
    int myTurnIndex = p - 1;

    while (myTurnCount < t) {
        string convertedDigit = GetConvertedDigit(currentNum, n);
        numbers += convertedDigit;

        if (myTurnIndex < numbers.length()) {
            answer += numbers[myTurnIndex];
            myTurnIndex += m;
            myTurnCount++;
        }
        currentNum++;
    }


    return answer;
}

 

 

 

728x90
λ°˜μ‘ν˜•