늘 말하는 이야기지만 나는 문자열을 좋아하지 않는다.
백준에서는 허용 범위를 초과하는 큰수는 에러가 나기 때문에 문자열을 이용하여 계산해야 하는데 나는 문자열을 잘 사용하지 못하기 때문에 이에 큰땀을 흘렸다.
처음엔 되겠지 하면서
#include <stdio.h>
int main(){
unsigned long long A, B;
scanf("%llu %llu", &A,&B);
printf("%llu",A+B);
}
입구컷!
이에 다른 블로그 글 들의 샅샅이 뒤져서 이해는 못하지만 억지로 내 코드랑 억지로 섞어서 만들어 봤지만
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char num1[10002], num2[10002]; //입력받을 값
int a,b,x,i, cnt,sum=0, carry=0;
scanf("%s %s",num1, num2);
a= strlen(num1);
b=strlen(num2);
char bea1[a], bea2[b]; //재배열해 입력할 값
cnt=0;
for(i=a-1; i>=0;i--){ //첫번째 재배열
bea1[cnt++] = num1[i];
}
cnt=0;
for(i=b-1; i>=0;i--){ //두번째 재배열
bea2[cnt++]=num2[i];
}
x= a>b?a:b;
char result[x+1],real[x+1];
for(i=0;i<x ;i++){
sum +=bea1[i]-'0'+bea2[i]-'0'+carry;
while(sum<0) sum +='0';
if(sum>9) carry=1;
else carry=0;
sum%=10;
result[i]= sum+'0';
sum=0;
}
if(carry ==1)result[x]+='1';
cnt=0;
x=strlen(result);
for(i=x-1; i>=0;i--){
real[cnt++]=result[i];
}
printf("%s",real);
}
코드도 상당히 지저분하게 나올뿐더러 당연하게도 틀렸다.
그 이후로 잠깐 손 놓고있다가 다른 백준문제를 풀고 더욱 강해진 모습으로 다시 도전해봤는데
그동안 머리속에서 문자열에 대한 정리가 좀 되었는지 생각보다 더 수월하게 풀어졌다.
최종 코드
#include <stdio.h>
#include <string.h>
void reverse(char f[], int len){
char temp;
for(int i=0; i<len-- ;i++){
temp = f[i];
f[i]=f[len];
f[len]=temp;
}
}
int main(){
char a[100002], b[100002];
int lena,lenb, x, i, sum, carr=0;
scanf("%s %s", a,b);
lena=strlen(a);
lenb=strlen(b);
reverse(a,lena);// 역배열
reverse(b,lenb);
x=lena>lenb ? lena:lenb;
char result[100002];
for(i=0; i<x; i++){
sum=a[i]-'0' + b[i]-'0' + carr;
if (sum < 0)//자리수가 다를경우(sum < 0) sum은 -'0'이 한번 더 계산됨(둘중하나는 NULL이므로)
{
sum += '0';//그런경우 +'0'을 해서 맞춰준다.
}
carr=sum/10;
result[i]=sum%10 +'0';
}
if(carr==1){
result[x] = 1+'0';
}
x=strlen(result);
reverse(result,x);
printf("%s",result);
}
이전 코드보다 깔끔해진 모습에 너무 뿌듯했고, 이전엔 사용자 정의 함수에 대한 문자열 처리와 +-'0'에 대해 등등 생각치 못했던 것들을 얻어갈 수 있었다
여기서 가장 중요한건
if (sum < 0)//자리수가 다를경우(sum < 0) sum은 -'0'이 한번 더 계산됨(둘중하나는 NULL이므로)
{ sum += '0';//그런경우 +'0'을 해서 맞춰준다. }
이 코드라고 생각한다
이렇게 개고생해서 풀었지만 백준에선 브론즈 5다
'프로그래밍 > 백준' 카테고리의 다른 글
드디어 풀렸다 소수구하기! 1929 -C언어 (0) | 2022.09.27 |
---|---|
문자열문자열2 백준 1157 단어공부 -C언어 (2) | 2022.09.22 |
6. 백준 1193 분수찾기 분명 어려운 문제가 아닌데 어렵다 -C 언어 (0) | 2022.07.26 |
5. 백준 11720 숫자의 합 (공백없이 숫자'들' 받기) -C언어 (0) | 2022.07.26 |
4. 백준 15596 정수 n개의 합 구하기 (문제를 잘 읽자,사용자정의함수배열)- c언어 (0) | 2022.07.16 |