본문 바로가기

💻 Computer Science/Algorithm🐇

[C/C++] 백준 2475 : 검증수

728x90
반응형

C 숙련도 향상을 위해 기초문제를 또 풀어봅시다. 

5개의 숫자를 입력받아 각각 제곱하여 더한후 10으로나눈 나머지를 출력하면됩니다. 간단한 계산문제지만 단계별로 차근히 봅시다.

#include<stdio.h>

int main(void)
{
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);

    int x = (a*a+b*b+c*c+d*d+e*e)%10;
    printf("%d",x);
}

먼저 stdio.h 파일을 불러옵시다. 정수형 변수를 다루기때문에 main함수는 int main을 사용합니다.

입력받는 변수를 a,b,c,d,e로 정의할때 모든 변수를 선언해줘야합니다. int a,b,c,d,e; 는 변수를 선언합니다.

scanf로 입력을 받되 공백으로 구분하므로 입력문의 %d를 한칸씩 띄어줍니다. 

 

계산이 복잡하므로 printf에 계산식을 바로 대입하기보단 중간에 거쳐가는 변수를 설정해주는게 좋아보이네요.

거쳐가는 변수 x를 지정해줍시다. 입력받은수의 제곱의 합을 10으로 나눈 나머지.... %는 파이썬에서와 똑같이 나머지를 구하는 기능을합니다. int x로 x를 선언하면서 동시에 x=~~~하며 정의해주는 모습입니다.

 

이렇게 잘 해결될수있는 문제인데요.... 저는 아래코드땜에 좀 해맸습니다. 

#include<stdio.h>

int main(void)
{
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);

    int x = (a*a+b*b+c*c+d*d+e*e)%10;
    printf("%d",&x);
}

같아보이는데.. 차이가 뭘까요? 바로 printf에서 출력값이 x가 아닌 &x인 점입니다. 뭐가다를까요??

바로 x는 x자체를 나타내지만 &x는 x의 주솟값을 나타낸다는 점입니다. 변수를 선언할때 컴퓨터 내부에선 선언된 변수에 주소를 할당하는데요, 변수값은 해당 주소에 들어가서 거주하게되죠. 만약 변수값이 바뀌면? 이전에 살던 변수를 내쫓고 새로운 변수를 살게하나요? 아닙니다. 이전 변수는 그대로 살게하고 동명의 변수에 새로운주소를 할당합니다. 

(주소 할당에 대한 부분은 부트캠프에서 듣고있는데.. 완강하면 그때 한번 올려보겠읍니다..)

 

암튼 &x는 x의 address값을 출력합니다. 그러니 계산식과는 무관한 아주 뚱딴지같은값이 출력되죠. scanf에서 변수를 입력받을때는 &a, &b를 써서 각 %d들을 &a, &b등 'address'에 저장되는겁니다. 주소를 알려줘서 거기에서 살게하는거죠

 

그러나 출력문에 &를 써버리면... 계산식과 아무상관없는 변수의 주솟값이 출력되는 사고가 발생하니.. 출력문에는 &를 쓰면 안되죠.. C린이 이슈땜에 좀 헤맸네요..

반응형