촉촉한초코칩

[백준] 11005(진법 변환 2) C언어 본문

Algorithm

[백준] 11005(진법 변환 2) C언어

햄친구베이컨 2024. 9. 7. 22:24

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다.

 


 

이 계산을 반대로 하면 되지 않을까..? result += (j) * pow(n, tmp) → result = result − j * (n^tmp)

그런데 생각해보면 우리는 j를 미리 알고있는게 아니기 때문에 이 방법을 쓸 수 없음 

result와 n을 나눈 나머지가 정답임 

#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
  char s[50] = "";
  int n;
  long long result = 0;
  int tmp = 0;
  int j = 0;

  scanf("%lld %d", &result, &n);

  char ans[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

  while(result>0) {
    tmp = result % n;
    result = result / n;
    for(int i=0; i<strlen(ans); i++) {
      if (tmp == i) {
        s[j] = ans[i];
        j+=1;
      }
    }
  }

  printf("%s\n", s);
  
}

 

또 똑같은 문제 발생.. 거꾸로 출력됨 

#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
  char s[50] = "";
  int n;
  long long result = 0;
  int tmp = 0;
  int j = 0;

  scanf("%lld %d", &result, &n);

  char ans[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

  while(result>0) {
    tmp = result % n;
    result = result / n;
    for(int i=0; i<strlen(ans); i++) {
      if (tmp == i) {
        s[j] = ans[i];
        j+=1;
      }
    }
  }

  j = strlen(s);
  for(int i=j; i>=0; i--) {
    printf("%c", s[i]);
  }
  
}

 

틀렸다고 함.. 반례를 더 찾아봄

https://www.acmicpc.net/board/view/145878 여기에 나온 반례는 전부 다 정답이라고 나오는데..

 

해결 

  • 마지막에 s를 출력할 때 i 설정을 j라고 해서 틀림 → j-1로 수정 (s배열의 마지막 (아무것도 없는 값?)을 출력하려고 해서 틀린 건가?)
#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
  char s[100] = "";
  int n;
  long long result = 0;
  int tmp = 0;
  int j = 0;

  scanf("%lld %d", &result, &n);

  char ans[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

  while(result>0) {
    tmp = result % n;
    result = result / n;
    for(int i=0; i<strlen(ans); i++) {
      if (tmp == i) {
        s[j] = ans[i];
        j+=1;
      }
    }
  }

  j = strlen(s);
  for(int i=j-1; i>=0; i--) {
    printf("%c", s[i]);
  }
  
}