본문 바로가기
공부기록/[Algorithm]

백준 11005번 <진법 변환 2> - C++

by RiverWon 2024. 8. 9.

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

생각


처음엔 이렇게 간단하게 하면 될 줄 알았다. 입력받은 십진수 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;
}

주석처리 돼 있는 애들은 과정 보려고 넣어놨던 것이당

 

다시 한 번 느꼈다. 케이스 분류의 중요성, 기록의 위대함