오늘의 목표

  • 아침 코드카타
  • 2-3 강의 수강
  • 2-3 복습
  • 2-4 강의 수강

추가 목표: 깃허브 기초 공부


 

1. 아침 코드카타

<오늘의 문제> 정수 내림차순으로 배치하기

 

<구상>

점수 각 자릿수를 while문으로 순환하며 vector에 push_back() 한 뒤, sort()해서 다시 반복문으로 vector를 순환하며 answer에 집어넣으려고 한다.

 

<구현>

#include <string>
#include <vector>

using namespace std;

int main () {
    long long n = 118372;
    long long answer = 0;
    // 정수 각 자릿수 벡터에 저장하기
    vector<long long> num;
    while (n > 1) {
        num.push_back(n % 10);
        n /= 10;
    }
	
    // bubble sort
    long long temp;
    for (int i = num.size() - 1; i >= 0; --i) {
        if (num[i - 1] < num[i]) {
            for (int j = i; j >= 0; --j) {
                if (num[j - 1] < num[j]) {
                    temp = num[j - 1];
                    num[j - 1] = num[j];
                    num[j] = temp;
                }
            }
        }
    }

	// long long 변수로 옮기기
    for (int i = 0; i < num.size(); ++i) {
        answer = (answer * 10) + num[i];
    }

    printf("answer: %lld", answer);
    return 0;
}

 

<오류> vector out of range

반복문에서 range를 잘못 설정한 것 같다.

문제가 되는 부분을 찾아본다.

 

    for (int i = num.size() - 1; i > 0; --i) {	// i-1을 해야하므로 i > 0
        if (num[i - 1] < num[i]) {
            for (int j = i; j > 0; --j) {	// j-1을 해야하므로 j > 0
                if (num[j - 1] < num[j]) {
                    temp = num[j - 1];
                    num[j - 1] = num[j];
                    num[j] = temp;
                }
            }
        }
    }

 

이 부분은 해결됐다.

다만 출력값이 예상과 다르게 나온다.

 

기대 출력값: 873211
실제 출력값: 87231

 

값을 출력시켜 과정을 확인해보자.

 

27381
answer: 87231

애초에 vector에 저장될 때부터 잘못된 숫자가 저장되는 것을 알 수 있다.

279811으로 올바르게 저장되어야 한다.

 

마지막 1이 저장되지 않는 것을 보니 순환을 잘못 시키고 있는 것 같다.

 

while (n >= 1) {	// 1도 자연수이므로 포함시켜야 한다.
    printf("%lld", n % 10);
    num.push_back(n % 10);
    n /= 10;
}

 

 

872311

 

이제 끝까지 출력되기는 한다.

 

반복문 사용 시 range에 항상 주의할 것.

 

그러나 873211이 아니라 872311로 정렬이 제대로 되어있지 않다.

bubble sort 코드를 출력해서 확인해보자.

 

i loop: 273811
i loop: 273811
j loop: 278311
j loop: 287311
j loop: 827311
i loop: 827311
j loop: 872311
j loop: 872311
i loop: 872311
i loop: 872311
872311

 

7을 앞으로 당겨오면서  2가 원래 7이 있던 자리로 가게 되어서 sorting을 피해가게 되는 구조로 쓰여있다.

 

이를 개선할 방법이 뭐가 있을까.

 

생각이 안 나서 검색해봤더니 j loop를 그냥 0에서 시작시키면 되는거였다...()

이렇게 간단한 게 왜 생각이 안 났을까... 기억해두자.

 

 

#include <string>
#include <vector>
//#define DEBUG

using namespace std;

int main () {
    long long n = 118372;
    long long answer = 0;
    // 정수 각 자릿수 벡터에 저장하기
    vector<long long> num;
    while (n >= 1) {
        num.push_back(n % 10);
        n /= 10;
    }


    

    long long temp;
    // bubble sort
    for (int i =  0; i < num.size() - 1; ++i) {
            for (int j = 0; j < num.size() - 1; ++j) {
                if (num[j] < num[j+1]) {
                    temp = num[j + 1];
                    num[j + 1] = num[j];
                    num[j] = temp;
                }
#ifdef DEBUG
                printf("j loop: ");
                for (auto n : num) {
                    printf("%d", n);
                }
                printf("\n");
#endif 
            }
    
#ifdef DEBUG
        printf("i loop: ");
        for (auto n : num) {
            printf("%d", n);
        }
        printf("\n");
#endif
    }

    for (int i = 0; i < num.size(); ++i) {
        answer = (answer * 10) + num[i];
    }

    printf("%lld", answer);
    return 0;
}

 

완성.

 

bubble sort 말고 vector에 내장된 sort() 함수를 사용해서 간단하게 짜는 코드도 구현해봤다.

 

#include <string>
#include <vector>
#include <algorithm>
#include <functional>


using namespace std;

int main () {
    long long n = 118372;
    long long answer = 0;
    // 정수 각 자릿수 벡터에 저장하기
    vector<long long> num;
    while (n >= 1) {
        num.push_back(n % 10);
        n /= 10;
    }

    // vector sort
    sort(num.begin(), num.end(), greater<long long>());


    for (int i = 0; i < num.size(); ++i) {
        answer = (answer * 10) + num[i];
    }

    printf("%lld", answer);
    return 0;
}

 

 


 

 

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/03/23 TIL  (1) 2026.03.23
2026/03/20 TIL  (0) 2026.03.20
2026/03/18 TIL  (0) 2026.03.18
2026/03/17 TIL  (0) 2026.03.17
2026/03/16 TIL  (0) 2026.03.16

+ Recent posts