2024. 6. 7. 01:22ㆍIT/BaekJoon
문제 링크
https://www.acmicpc.net/problem/2998
문제
창영이는 여러 가지 진법을 공부하고 있다. 창영이는 어제 2진법을 배웠고, 오늘은 8진법을 배웠다. 이제, 2진법 수를 8진법 수로 변환하려고 한다.
창영이가 사용한 방법은 다음과 같다.
- 2진수의 길이가 3으로 나누어 떨어질 때 까지 수의 앞에 0을 붙인다.
- 그 다음, 3자리씩 그룹을 나눈다.
- 아래의 표를 참고해 8진수로 바꾼다.
2진수가 주어졌을 때, 창영이가 사용한 방법을 이용해 8진수로 바꾸는 프로그램을 작성하시오.

입력
첫째 줄에 2진수가 주어진다. 이 수는 100자리 이내이고, 첫 번째 자리는 1이다.
출력
첫째 줄에 8진수를 출력한다.

통과한 답안
using System.Text;
namespace _2998
{
internal class Program
{
static void Main(string[] args)
{
string input = Console.ReadLine();
while (input.Length % 3 != 0)
{
input = input.PadLeft(input.Length + 1, '0');
}
string oct = MakeOct(input);
Console.WriteLine(oct);
}
static string MakeOct(string input)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.Length; i += 3)
{
string now = input.Substring(i, 3);
switch (now)
{
case "000": sb.Append('0'); break;
case "001": sb.Append('1'); break;
case "010": sb.Append('2'); break;
case "011": sb.Append('3'); break;
case "100": sb.Append('4'); break;
case "101": sb.Append('5'); break;
case "110": sb.Append('6'); break;
case "111": sb.Append('7'); break;
}
}
return sb.ToString();
}
}
}
2진수로 주어진 수를 8진수로 변환하는 코드를 작성하는 문제이다.
문제에서 시킨 방식을 따라서 코드를 작성하는 것이 포인트인데,
1. 길이가 3으로 나누어 떨어질 때까지 수의 앞(왼쪽에) 0을 붙이기
while (input.Length % 3 != 0)
{
input = input.PadLeft(input.Length + 1, '0');
}
2. 3자리씩 그룹을 나누기
for (int i = 0; i < input.Length; i += 3)
{
string now = input.Substring(i, 3);
}
3. 주어진 방식으로 8진수로 바꾸기
switch (now)
{
case "000": sb.Append('0'); break;
case "001": sb.Append('1'); break;
case "010": sb.Append('2'); break;
case "011": sb.Append('3'); break;
case "100": sb.Append('4'); break;
case "101": sb.Append('5'); break;
case "110": sb.Append('6'); break;
case "111": sb.Append('7'); break;
}
의 주어진 조건에 따라서 코드를 구현하는 것이 포인트인 문제였다.
swtich 문을 이용하여서 한 눈에 알아볼 수 있도록 구현한 것이 장점이라고 생각한다.
세 자리로 나눈 숫자를 가지고 8진수로 바꾸는 방법은
이외에도 두 가지를 더 생각해볼 수 있었는데,
1. ToInt32.Convert(숫자, 2)이용하기
for (int i = 0; i < input.Length; i += 3)
{
int now = Convert.ToInt32(input.Substring(i, 3), 2);
sb.Append(now.ToString());
}
위의 switch 문 대신에 Convert 메서드를 이용하는 방법으로
for 문을 위와 같이 수정하여 사용할 수 있다.
내장된 기능을 사용하긴 하지만, 훨씬 깔끔하게 구현할 수 있다.
2. 직접 숫자를 구하기
for (int i = 0; i < input.Length; i += 3)
{
int now = int.Parse(input.Substring(i, 3));
int result = now / 100 * 4 + ((now % 100) / 10 * 2) + now % 10;
sb.Append(result.ToString());
}
위의 Convert의 메서드를 실제로 구현한 것으로,
세 자리로 나눈 2진수 숫자는 백의 자리가 4, 십의 자리가 2, 1의 자리가 1을 나타내므로,
이를 직접 구해서 result로 변환하여 sb에 추가하는 방식을 이용하였다.
이 방법을 사용하면 코드도 훨씬 간단해지며 내장 메서드를 사용하지 않고
세 자리로 표현된 2진수를 8진수로 변환할 수 있다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 2160: 그림 비교 (C#) (1) | 2024.06.07 |
---|---|
[BAEKJOON] 백준 9094: 수학적 호기심 (C#) (0) | 2024.06.07 |
[BAEKJOON] 백준 2979: 트럭 주차 (C#) (0) | 2024.06.07 |
[BAEKJOON] 백준 2909: 캔디 구매 (C#) (0) | 2024.06.06 |
[BAEKJOON] 백준 12841: 정보대 등산 (C#) (0) | 2024.06.06 |