
이거 푸는 데 너무 오래 걸려서.. 과정이라도 기록으로 남기려고 한다.

생각
처음엔 이렇게 간단하게 하면 될 줄 알았다. 입력받은 십진수 n을 b진법으로 나타내기 위해 계속 b로 나누며 나머지를 새 배열에 저장한 뒤에, 역순으로 꺼내는 방식. 간단하다. 사실 이게 맞는 거기도 하다. 근데, 예외 처리를 하지 않았다.
1. n<b인 경우. 그러니까, 진법 변환은 하는 거긴 한데, 나눗셈을 할 이유가 없는 것이다. n자체가 나머지이니까.
1-1. n<10인 경우. 얘들은 A,B,C, ...로 바꿀 필요도 없다.
1-2. 그러니 9<n<36인 애들만 고려해서 문자처리 해 주면 된다
이렇게 하고 채점을 5번이나 돌렸는데, 계속 틀리더라. 한 번 틀리면 내 오류지 채점기 오류가 아닌 건 알고 있다. 하지만 사람심리라는게 어쩔 수 없다. 할 수 없이 질문게시글 올려놓고 오늘 다시 켰는데, 답글에 조건문 하나가 잘못 고려되었다고 써 있었다. 등호처리를 하나 하지 않아서, 10이 저장된 배열이 A로 바뀌지 않는 현상이 발생하고 있었다. 이런 반례를 대체 어떻게 찾아냈는지 모르겠다. 암덩어리 사라진 기분이었다. 그치만 벌써 어려워하면 안 된다. 겨우 브론즈 난이도고, 언젠가 다이아, 루비도 풀어야 한다.
#include <algorithm>
#include <iostream>
#include <math.h> //C
#include <cmath> //C++
using namespace std;
int main() {
int cnt=0;
int b = 0;
int n = 0;
int arr[100] = {0,}; // 나머지를 저장할 배열
char ch[100];
int len=0;
cin >> n >> b;
if(n<b){
if(n<10) cout << n; // 변환할 필요가 없는 것들에 대해서
else{
cout << char(n+55);
}
}
else{
for(int i=0; n>=b; i++){
arr[i] = n % b;
n = n / b;
len ++;
// cout << "arr[i] now is " << arr[i] << '\n';
// cout << "n now is " << n << '\n';
// cout << "i now is " << i << '\n';
// cout << '\n';
cnt = i;
}
// cout << "cnt is " << cnt << '\n';
arr[cnt+1] = n;
// cout << "ch[cnt] is " << arr[cnt] << '\n';
// cout << "cnt now is : " << cnt << '\n';
for(int i=0; i<=len; i++){
if(arr[i]>=0 && arr[i]<10){ch[i] = arr[i]+48;}
else if(arr[i]>=10 && arr[i]<36){ch[i] = arr[i]+55;}
}
for(int i=len; i>=0; i--){
cout << ch[i];
}
}
return 0;
}
주석처리 돼 있는 애들은 과정 보려고 넣어놨던 것이당
다시 한 번 느꼈다. 케이스 분류의 중요성, 기록의 위대함
'공부기록 > [Algorithm]' 카테고리의 다른 글
| 백준 2775번 <부녀회장이 될테야> - C++ (2) | 2024.08.12 |
|---|---|
| 백준 2231번 <분해합> - C++ (1) | 2024.08.11 |
| 백준 2745번 <진법 변환> - C++ (1) | 2024.08.07 |
| 백준 2563번 <색종이> - C++ (0) | 2024.08.06 |
| 백준 1157번 <단어 공부> - C++ (0) | 2024.08.04 |