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

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

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

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

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

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

 

● 알아야 할 것

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

: string to int 함수 → stoi( string )

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

 

● 풀이 과정

: 주어지는 수의 길이가 1,000,000 넘지않는게 아니라 주어지는 수가 1,000,000를 넘는거 아닌가?
수의 길이가 1,000,000은 너무 긴거 아닌가?

또 문제 오류를 의심하는 어리석은 생각을 하였다.

 

: 주어지는 수가 너무 기니까 숫자로 받을 수 없다는 힌트를 준 것이었다.

따라서 문자열로 입력받아서 처리하여야 한다.

 

: 2진수에서 8진수로 바꿀 때

2진수 → 10진수 → 8진수 이렇게 바꿀까 생각했는데

주어지는 수의 길이가 100만이므로 1자리씩 확인하면서 계산을 하면 '시간 초과'의 우려가 있을 것 같아서

2진수의 3자리는 8진수의 1자리와 동일하게 표현할 수 있으므로 더 빠를거라 생각했다.

(그럼 대략 100만/3 → 33만 인데 (기억상 10만 data → 1초) 똑같이 '시간 초과' 아닌가..?)

 

● 주의 할 것

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

 

● 참고 할 것

: 2진수를 8진수로 바꿀 때 3자리씩 자르는 법의 이해

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

 

● 풀이 코드

#include <bits/stdc++.h>

using namespace std;

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

// 2진수를 8진수로 바꾸는 함수
int change_2_to_8(int n)
{
    // 2진수의 3자릿수는 8진수의 1자리이다
    return (n / 100) * 4 + ((n / 10) % 10) * 2 + (n % 10) * 1;
}


int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    // 주어지는 수 입력
    cin >> str;
    
    // 주어지는 수에서 3개의 자릿수를 묶어서 8진수로 표현한다
    
    // 주어지는 수의 길이를 3으로 나눈 나머지가 0인 경우
    if(str.length() % 3 == 0)
    {
        // 처음부터 3개씩 묶어서 8진수로 출력
        for(int s = 0; s < str.length(); s += 3)
            cout << change_2_to_8(stoi(str.substr(s, 3)));
        
    }
    // 주어지는 수의 길이를 3으로 나눈 나머지가 1인 경우
    else if(str.length() % 3 == 1)
    {
        // 맨 앞 자릿수 1개만 먼저 8진수로 출력
        cout << change_2_to_8(stoi(str.substr(0, 1)));
        
        // 두 번째 자리수부터 3개씩 묶어서 8진수로 출력
        for(int s = 1; s < str.length(); s += 3)
            cout << change_2_to_8(stoi(str.substr(s, 3)));
    }
    // 주어지는 수의 길이를 3으로 나눈 나머지가 2인 경우
    else if(str.length() % 3 == 2)
    {
        // 맨 앞 자릿수 2개만 먼저 8진수로 출력
        cout << change_2_to_8(stoi(str.substr(0, 2)));
        
        // 세 번째 자리수부터 3개씩 묶어서 8진수로 출력
        for(int s = 2; s < str.length(); s += 3)
            cout << change_2_to_8(stoi(str.substr(s, 3)));
    }
    
    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

댓글