오늘의 목표
- 아침 코드카타
- 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 |