안녕하세요. BlockDMask 입니다.
오늘은 8진수를 2진수로 바꾸는 문제를 풀어보았습니다.
0. 제목
백준 1212 8진수 2진수
BOJ 1212 Oct to Binary
C/C++ 8진수를 2진수로
1. 문제 설명
8진수가 주어졌을때, 2진수로 변환하는 프로그램을 작성하시오.
첫째 줄에 8진주가 주어집니다.
수의 "길이"는 333,334를 넘지 않습니다.
첫째 줄에 주어진 수를 2진수로 변환하여 출력합니다.
수가 0인 경우를 제외하고는 반드시 1로 시작해야 합니다.
입력) 0
출력) 0
입력) 362
출력) 11110010
2. 풀이 과정
두가지 방법으로 문제를 풀었습니다.
a. 8진수 한자리를 나누고, 나눈 몫과 나머지를 통해서 2진수 세자리로 변환하는 방식.
b. 8진수 한자리를 미리 저장해둔 2진수 세자리로 변환하는 방식.
(8진수 맨 첫째 수는 2진수 한,두,세자리로 변환)
a방법으로 풀고, 걸린 시간이 커서 고민하다가 b방법을 생각하게 되었습니다.
8진수에서 2진수로 바꿀때 경우의 수 (0~7)가 8가지 밖에 없으므로 가능한 방법이라 생각합니다.
3. 소스 코드
a. 8진수 한자리를 나누고, 나눈 몫과 나머지를 통해서 2진수 세자리로 변환하는 방식.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | //https://www.acmicpc.net/problem/1212 //BOJ_1212_octToBinary #include<iostream> #include<cstdio> #define MAX_LEN 3 using namespace std; class change{ private: string str; //8진수를 담을 문자열 int len; //문자열의 길이 public: void setStr(); void callSolution(); void solution(int num, bool first); void printFirstNum(int * arr); //8진수->2진수 첫번째 수를 출력 void printNum(int * arr) const; //8진수->2진수 나머지 수 출력 }; void change::printFirstNum(int * arr){ bool check = false; for(int i=0; i<MAX_LEN; i++){ if(check){ //1이 나온 다음부터 0이든 1이든 출력 printf("%d", arr[i]); continue; }else if(arr[i] == 1){ //첫번째 1일때 check를 true로 바꾸고 출력 check = true; printf("%d", arr[i]); } } } //8진수->2진수 나머지 수 출력 void change::printNum(int * arr) const{ for(int i=0; i<MAX_LEN; i++){ printf("%d", arr[i]); } } void change::setStr(){ cin >> str; len = static_cast<int>(str.size()); } void change::callSolution(){ this->solution(str[0]-'0', true); //맨 처음 수 for(int i=1; i<len ;i++){ this->solution(str[i]-'0', false); } } void change::solution(int num, bool first){ //맨 처음에 0이 들어온 경우 예외처리 if(first && num==0){ printf("%d", 0); return; } int arr[MAX_LEN] = {0}; //2진수로 바꾼 수를 담을 배열 int idx = MAX_LEN-1; //배열의 index while(num>0){ //oct -> binary arr[idx--] = num%2; num/=2; } if(first) { printFirstNum(arr); }else { printNum(arr); } } int main(void){ change oct; oct.setStr(); oct.callSolution(); return 0; } | cs |
b. 8진수 한자리를 미리 저장해둔 2진수 세자리로 변환하는 방식.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | //https://www.acmicpc.net/problem/1212 //BOJ_1212_octToBinary #include<iostream> #include<cstdio> #include<string> using namespace std; class change{ private: string str; int len; string str1[8] = {"0", "1", "10", "11", "110", "101", "110", "111"}; string str2[8] = {"000", "001", "010", "011", "100", "101", "110", "111"}; public: void setStr(){ cin >> str; len = static_cast<int>(str.size()); } void callSolution(){ this->printFirstNum(str[0]-'0'); //8진수 맨 처음 수 for(int i=1; i<len ;i++){ this->printNum(str[i]-'0'); } } void printFirstNum(int num) const{ cout << str1[num]; } void printNum(int num) const{ cout << str2[num]; } }; int main(void){ change oct; oct.setStr(); oct.callSolution(); return 0; } | cs |
4. 인증
a. 8진수 한자리를 나누고, 나눈 몫과 나머지를 통해서 2진수 세자리로 변환하는 방식.
b. 8진수 한자리를 미리 저장해둔 2진수 세자리로 변환하는 방식.
- 문제출처 :https://www.acmicpc.net/problem/1212
감사합니다.
'<알고리즘 문제풀이&연습> > [C++] 백준, 프로그래머스 등등' 카테고리의 다른 글
[Level 1] 약수의 합 (C언어 약수구하기) (0) | 2017.12.12 |
---|---|
[백준 2748] 피보나치 수2 (0) | 2017.12.05 |
[백준 1924] 2007년 (0) | 2017.12.04 |
[백준 5648] 역원소 정렬 (0) | 2017.11.29 |
[백준 2447] 별찍기10 (1) | 2017.11.22 |
[백준 2446] 별찍기9 (0) | 2017.11.21 |
[백준 10820] 문자열 분석 (0) | 2017.11.21 |
[백준 2445] 별찍기8 (0) | 2017.11.20 |