추천글
코테 - 이진수를 십진수로 변환하는 5가지 방법
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
이진수를 십진수로 변환하는 문제는 코딩 테스트에서 자주 등장하는 기본 문제입니다. 이 글에서는 C언어를 사용하여 이 문제를 해결하는 5가지 방법을 소개합니다. 각 방법은 서로 다른 알고리즘과 접근 방식을 사용하며, 코드와 함께 자세한 설명을 제공합니다.
1. 반복문을 사용한 기본 변환
이 방법은 이진수의 각 자릿수를 오른쪽에서 왼쪽으로 읽으며, 각 자릿수에 2의 거듭제곱을 곱해 십진수를 계산합니다.
#include <stdio.h>
int binaryToDecimal(long long binary) {
int decimal = 0, base = 1;
while (binary) {
int digit = binary % 10;
decimal += digit * base;
base *= 2;
binary /= 10;
}
return decimal;
}
int main() {
long long binary;
printf("이진수를 입력하세요: ");
scanf("%lld", &binary);
printf("십진수: %d\n", binaryToDecimal(binary));
return 0;
}
설명: 입력된 이진수를 정수로 처리하고, 각 자릿수를 추출하여 2의 거듭제곱(base)을 곱합니다. 이 방법은 직관적이며, 입력이 긴 이진수일 때도 효과적입니다.
2. 문자열로 처리하는 방법
이진수를 문자열로 입력받아 각 문자를 처리하는 방법입니다. 문자열의 각 문자를 숫자로 변환하여 계산합니다.
#include <stdio.h>
#include <string.h>
int binaryToDecimal(char *binary) {
int decimal = 0;
int len = strlen(binary);
for (int i = 0; i < len; i++) {
decimal = decimal * 2 + (binary[i] - '0');
}
return decimal;
}
int main() {
char binary[65];
printf("이진수를 입력하세요: ");
scanf("%s", binary);
printf("십진수: %d\n", binaryToDecimal(binary));
return 0;
}
설명: 이진수를 문자열로 입력받아 각 문자를 처리합니다. 각 단계에서 십진수를 2배 하고 현재 자릿수를 더하는 방식으로 계산합니다. 문자열 입력을 처리해야 하는 경우 유용합니다.
3. 재귀를 사용한 변환
재귀 호출을 사용하여 이진수를 십진수로 변환합니다. 이진수의 각 자릿수를 재귀적으로 처리합니다.
#include <stdio.h>
int binaryToDecimal(long long binary, int base) {
if (binary == 0) return 0;
return (binary % 10) * base + binaryToDecimal(binary / 10, base * 2);
}
int main() {
long long binary;
printf("이진수를 입력하세요: ");
scanf("%lld", &binary);
printf("십진수: %d\n", binaryToDecimal(binary, 1));
return 0;
}
설명: 이진수의 마지막 자릿수를 처리하고, 나머지 자릿수를 재귀적으로 계산합니다. base는 2의 거듭제곱을 나타내며, 재귀 호출마다 2배가 됩니다. 코드가 간결하지만, 긴 이진수에서는 스택 오버플로우 위험이 있습니다.
4. 비트 연산을 사용한 방법
이진수를 비트 단위로 처리하여 십진수를 계산합니다. 이 방법은 이진수의 본질을 비트로 간주합니다.
#include <stdio.h>
int binaryToDecimal(long long binary) {
int decimal = 0;
while (binary) {
decimal = (decimal << 1) | (binary % 10);
binary /= 10;
}
return decimal;
}
int main() {
long long binary;
printf("이진수를 입력하세요: ");
scanf("%lld", &binary);
printf("십진수: %d\n", binaryToDecimal(binary));
return 0;
}
설명: 이진수의 각 자릿수를 비트로 간주하고, 왼쪽 시프트(<<)와 OR(|) 연산을 사용하여 십진수를 구성합니다. 이 방법은 비트 연산에 익숙한 경우 이해하기 쉽습니다.
5. 수학적 계산(제곱 함수 사용)
수학 라이브러리의 pow 함수를 사용하여 2의 거듭제곱을 계산합니다. 이 방법은 명시적으로 제곱을 계산합니다.
#include <stdio.h>
#include <math.h>
int binaryToDecimal(long long binary) {
int decimal = 0, position = 0;
while (binary) {
int digit = binary % 10;
decimal += digit * pow(2, position);
position++;
binary /= 10;
}
return decimal;
}
int main() {
long long binary;
printf("이진수를 입력하세요: ");
scanf("%lld", &binary);
printf("십진수: %d\n", binaryToDecimal(binary));
return 0;
}
설명: 각 자릿수에 2의 거듭제곱(pow(2, position))을 곱하여 십진수를 계산합니다. 이 방법은 이해하기 쉽지만, pow 함수의 부동소수점 계산으로 인해 성능이 약간 떨어질 수 있습니다.
결론
위 5가지 방법은 각각의 장단점이 있습니다:
- 반복문 방법: 직관적이고 효율적이며, 대부분의 경우 적합.
- 문자열 방법: 문자열 입력 처리에 유용.
- 재귀 방법: 코드가 간결하지만, 긴 입력에서 비효율적.
- 비트 연산 방법: 비트 연산에 익숙한 경우 적합.
- 수학적 계산: 명시적이지만, 성능이 약간 떨어짐.
코딩 테스트에서는 입력 형식과 성능 요구 사항에 따라 적절한 방법을 선택하는 것이 중요합니다. 이 코드를 참고하여 여러 접근 방식을 연습해보세요!
댓글
댓글 쓰기