반응형
[ 문제 ]
두 개의 이진수를 입력받아 이를 더하는 프로그램을 작성하시오.
[ 코드 ]
1. 내 코드
StreamReader sr = new StreamReader(new BufferedStream(Console.OpenStandardInput()));
StreamWriter sw = new StreamWriter(new BufferedStream(Console.OpenStandardOutput()));
string[] n = sr.ReadLine().Split();
string a = n[0];
string b = n[1];
char[] aC = a.ToCharArray();
char[] bC = b.ToCharArray();
// 배열을 뒤집어서 앞에서부터 계산하기(이건 개인취향... 굳이 Reverse안하고 i를 맨 마지막 값으로 설정하고 i--해주면 됨)
Array.Reverse(aC);
Array.Reverse(bC);
int maxLength = Math.Max(aC.Length, bC.Length);
char[] result = new char[maxLength + 1]; // 이진수 덧셈값이 저장될 배열. 최상위 캐리값이 생길 수 있으니 +1 배열의 크기를 생성
int carry = 0;
for (int i = 0; i < maxLength; i++)
{
// 자릿수 맞추는 용도
int digitA = (i < aC.Length) ? (aC[i] - '0') : 0;
int digitB = (i < bC.Length) ? (bC[i] - '0') : 0;
int sum = digitA + digitB + carry;
result[i] = (sum % 2 == 0) ? '0' : '1';
carry = sum / 2;
}
// 최상위 자릿수를 어떻게 할건지
if (carry > 0)
{
result[maxLength] = '1'; // carry가 1이면 a+b의 마지막 인덱스의 합이 2를 넘었다는것으로 결과 배열의 가장 마지막 자리에 1을 할당
}
else
{
Array.Resize(ref result, maxLength); // 아니면 배열크기를 maxLength+1해줬던걸 다시 크기 maxLength만큼으로 수정
}
Array.Reverse(result); // 처음에 뒤집은 배열 다시 뒤집어주기
string resultStr = new string(result); // char배열을 문자열로 만들어주기
// result배열의 합이 0이면 0을 출력하고 아니면 resultStr을 앞 0 제거하고 출력
int[] resultInt = Array.ConvertAll(result, c => (int)Char.GetNumericValue(c));
int resultSum = resultInt.Sum();
if (resultSum == 0)
{
sw.Write(0);
}
else
{
sw.Write(resultStr.TrimStart('0'));
}
sw.Flush();
sw.Close();
sr.Close();
원래 resultStr == "0"일때 0을 출력하라고 했는데 0 0은 잘 출력이 됐지만 00 00 이렇게 입력이 되면 문자열이라 else문으로 작동이 돼서 지워졌다.
그래서 귀찮지만 int로 바꿔서 합을 구해주고 0이 아닌 수는 그대로 문자열을 TrimStart해서 출력하게 했다.
2. 다른 사람 코드
var a = Console.ReadLine()!.Split(' ');
int l = Math.Max(a[0].Length, a[1].Length);
var c = new int[l];
for (int i = 1; i <= l; i++)
{
if (a[0].Length > i - 1) c[^i] += a[0][^i] - 48;
if (a[1].Length > i - 1) c[^i] += a[1][^i] - 48;
if (c[^i] > 1)
{
if (i == l) c[0] += 8;
else
{
c[^i] -= 2;
c[^(i + 1)]++;
}
}
}
bool b = false;
for (int i = 0; i < l; i++)
{
b = c[i] > 0 || b;
if (b) Console.Write(c[i]);
}
if(!b)Console.WriteLine(0);
아주 간단하고 멋지당..
^i는 배열의 마지막부터 i번째에 인덱스를 가져오는거다. 나처럼 배열을 뒤집지않고 ^i를 통해서 배열을 뒤에서부터 읽은거다. 나도 잘 배워야겠다.
[ 실행화면 ]
문제링크: https://www.acmicpc.net/problem/1252
반응형
'Language > C#' 카테고리의 다른 글
[C#] 백준 1225번 이상한 곱셈 (2) | 2024.03.01 |
---|---|
[C#] 백준 1977번 완전제곱수 (0) | 2024.03.01 |
[C#] 백준 1373번 2진수 8진수 (0) | 2024.02.28 |
[C#] 백준 1212번 8진수 2진수 (0) | 2024.02.28 |
[C#] 백준 1159번 농구 경기 (0) | 2024.02.28 |