본문 바로가기
Baekjoon/[Code.plus] 알고리즘 기초 1/2

[BOJ/백준] 1212 8진수 2진수

by 해적거북 2021. 7. 29.
728x90

● [문제번호 1212] 8진수 2진수

https://www.acmicpc.net/problem/1212

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

 

● 알아야 할 것

: 2진수를 8진수로 바꾸는 방법

: string to int 함수 → stoi( string )

: string 부분 자르기 메소드 → string.substr(start index, num)

 

● 풀이 과정

: 앞서 2진수 → 8진수의 문제를 풀고 나니 훨씬 수월한 문제이다.

(참고) https://pirateturtle.tistory.com/191

2진수 → 8진수로 바꾸는 방법을 반대로 사용하면 된다.

 

: 대신 출력할 때 8진수의 맨 앞자리 수가 2진수로 3자리일 지, 2자리일 지, 1자리일 지 모른다.

(예를 들어 3 → 011, 2 → 010, 1 → 001 인 경우가 있다.)

그래서 맨 앞자리만 따로 작업해야하고

8진수의 2번째 자리부터는 2진수로 출력할 때 0까지 모두 출력하면 된다.

 

● 주의 할 것

: 입력되는 data의 범위를 고려하여 어떤 자료형을 선언할 지 고민해야한다.

 

● 참고 할 것

: 8진수를 2진수로 바꿀 때 3자리로 표현되는 법의 이해

https://m.blog.naver.com/icbanq/221727893563

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

// 주어지는 수의 길이가 333,334 까지 갈 수 있으므로 문자열로 받는다
string str;
int N;

// 8진수를 2진수로 바꾸는 함수
void change_8_to_2(int n)
{
    // 2진수의 3자릿수는 8진수의 1자리이다
    cout << (n / 2 / 2 % 2);
    cout << (n / 2 % 2);
    cout << (n % 2);
}


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    // 주어지는 수 입력
    cin >> str;
    
    // 8진수의 맨 앞자리만 따로 출력
    // 2진수로 바꿨을 때 011, 001과 같은 출력을 막기 위함
    int first_num = stoi(str.substr(0, 1));
    if(first_num >= 4)
        cout << (first_num / 2 / 2 % 2);
    if(first_num >= 2)
        cout << (first_num / 2 % 2);
    cout << (first_num % 2);
    
    // 8진수의 1자리씩 2진수의 3자리로 바꿔 출력    
    for(int s = 1; s < str.length(); s++)
        change_8_to_2(stoi(str.substr(s, 1)));
    
    return 0;
}

 

 

● [백준] - [알고리즘 기초 1/2] - [301 - 수학 1 (연습)] 문제집

번호 문제 번호 문제 이름 풀이 링크
1 9613 GCD 합 https://pirateturtle.tistory.com/189
2 17087 숨바꼭질 6 https://pirateturtle.tistory.com/190
3 1373 2진수 8진수 https://pirateturtle.tistory.com/191
4 1212 8진수 2진수 https://pirateturtle.tistory.com/192
5 2089 -2진수 https://pirateturtle.tistory.com/193
6 17103 골드바흐 파티션 https://pirateturtle.tistory.com/194

 

728x90

댓글