촉촉한초코칩

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

Algorithm

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

햄친구베이컨 2024. 9. 7. 21:29

문제

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

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

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

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

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

 


 

(vs code에서 c언어 실행하려고 했는데 안됨.. mingw 설치했는데도 실행이 안돼서 terminal에서 gcc 명령어로 실행 파일 만듦..)

 

코드 설명

AAAA 16이 입력되었다면, A는 10진수로 11이니까 11 * 16^0 + 11 * 16^1 +... 이렇게 계산이 되어야 한다. 

  1. 즉, 입력된 문자가 10진수로 몇인지 계산, 
  2. 거기에 입력된 진법^몇번째 숫자인지 
  3. 이걸 다 더하기 
#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
  char s[50];
  int n;
  int result = 0;

  scanf("%s %d", s, &n);

  char ans[] = {'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'};

  for(int i=strlen(s)-1; i>0-1; i--) {
    for(int j=0; j<26; j++) {
      if(s[i] == ans[j]) {
        result += (j+1) * pow(n, i);
        printf("%d %d %d %d\n", j+1, n, i, result);
      }
    }
  }

  printf("result : %d\n", result);
  
}

계산이 잘 되지 않음.. 어디서 잘못된거지?

문제 

  • a는 10부터 시작해야 하는데 내가 1부터 계산하고 있었음
  • 알파벳말고 숫자가 들어올 때는? 

해결 

  • ans에 0~9까지 추가하고 j+1로 변경 

 

문제점 발생..

  • 만약 10 10을 입력한다면, 1이 10^1, 0이 10^0이 되어야 하는데, 거꾸로 계산이 됨 

해결 

  • 지수를 계산할 다른 변수 선언 
#include <stdio.h>
#include <string.h>
#include <math.h>

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

  scanf("%s %d", s, &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'};

  for(int i=strlen(s)-1; i>=0; i--) {
    for(int j=0; j<strlen(ans); j++) {
      if(s[i] == ans[j]) {
        result += (j) * pow(n, tmp);
        // printf("%d %d %d %d\n", j, n, tmp, result);
      }
    }
    tmp+=1;
  }

  printf("%lld\n", result);
  
}

 

이제 어려운 문제들만 남았는데 어떻게 풀어야할지를 모르겠어서 계속 피하게됨.. 그냥 풀이 보면서 하자는 마음으로 했는데 막상 푸니까 나 스스로 풀게됨..ㅋㅋㅋ
일단 해보는 걸로..~!