728x90
● [문제번호 1373] 2진수 8진수
https://www.acmicpc.net/problem/1373
● 알아야 할 것
: 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
'Baekjoon > [Code.plus] 알고리즘 기초 1/2' 카테고리의 다른 글
[BOJ/백준] 17103 골드바흐 파티션 (0) | 2021.07.29 |
---|---|
[BOJ/백준] 2089 -2진수 (0) | 2021.07.29 |
[BOJ/백준] 1212 8진수 2진수 (0) | 2021.07.29 |
[BOJ/백준] 17087 숨바꼭질 6 (0) | 2021.07.29 |
[BOJ/백준] 9613 GCD 합 (0) | 2021.07.29 |
[BOJ/백준] 2004 조합 0의 개수 (0) | 2021.07.28 |
[BOJ/백준] 1676 팩토리얼 0의 개수 (0) | 2021.07.28 |
댓글