본문 바로가기
이론/알고리즘

백준 2745번: 진법변환

by 유세지 2018. 5. 31.

백준은 여기 안올리는데 이 문제는 하도 뻘짓을 많이 해서 올려본다.



시간 제한메모리 제한제출정답맞은 사람정답 비율
1 초128 MB34621937163657.103%

문제

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진법으로 출력한다.

예제 입력 1 

ZZZZZ 36

예제 출력 1 

60466175





처음엔

 

1
cin >> N >> B;
cs


이런 식으로 N (char 배열)과 B (int) 를 입력 받고, 문자이면 아스키 코드값을 이용해 진수값을 계산할 수 있도록 코드를 짜주었다.


Run-Time Check Failure #2 - Stack around the variable 'N' was corrupted


이 오류가 나면서 정상적으로 작동하지 않았지만.


정확히는 VS 환경에선 문자 그대로 '작동은' 잘했으나 ideone.com 과 같은 웹 ide에서 원하는 결과값이 나오지 않았다.


해당 오류 내용으로 구글링을 해본 결과 크기가 서로 맞지 않는 자료형에 대입하려고 했을때 Run-Time Check Failure #2 를 뱉어낸다고 하여 문자를 정수로 바꾸어 대입해주는 부분에서 문제가 있는 것으로 판단하고 고치려 하였다.

(출처: http://www.jynote.net/551)


1
2
3
char tmp[90];
sprintf(tmp, "%c", N[len - i] - 55);
N[len - i] = tmp[0];
cs


이런식으로 생전 처음보는 sprintf 라는 함수를 이용하여 char 값으로 바꿔 집어넣는 무식한 짓도 해보았지만 결과는 실패.


아무리 해봐도 문제가 해결되지 않아서 저 부분에서 시작해 코드 전체로 한 줄씩 주석을 씌운 끝에 처음 cin >> N; 부분에서 문제가 있음을 깨달았다.


허무하게도 cin >> N; 을 아래 scanf("%s", N); 으로 수정하니 해결.




덕분에 삽질 잘했다.


> 최종 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
using namespace std;
 
int main(void) {
    char N[32];
    long long B, res = 0;
    scanf("%s", N);
    cin >> B;
    int len = strlen(N);
    for (int i = len; i > 0; i--) {
        if (N[len - i] >= 65) {
            res += (long long)((N[len - i]-55* (long long)pow(B, i - 1));
        }
        else {
            res += (long long)((N[len - i]-48* (long long)pow(B, i - 1));
        }
    }
    cout << res;
}
cs



채점 번호아이디문제 번호결과메모리시간언어코드 길이제출한 시간
8812820kyr93892745맞았습니다!!2172 KB0 MSC++ 수정472 B26분 전
8812818kyr93892745컴파일 에러C++ 수정452 B26분 전
8812790kyr93892745틀렸습니다C++ 수정471 B38분 전
8812786kyr93892745틀렸습니다C++ 수정467 B


반응형

댓글