본문 바로가기

Coding Tests/백준 온라인

( C )백준 11720번(공백없이 숫자 입력하기)

<문제> 

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백 없이 주어진다.


 <오답>

처음 접근했던 방식인데, 이렇게 코드를 작성하여 주면, 문제의 조건에서처럼 한 줄에 입력받을 수가 없다.

#include<stdio.h>
int main(void)
{
	int n, i, z;
	int total = 0;
	
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &z); 
		total += z;
	}
	printf("%d", total);
	return 0;
}

 


<정답 풀이>

#include<stdio.h>
int main(void)
{
	int n, i;
	int z[100];
	int total = 0;
	
	scanf("%d", &n);
	
	for (i = 0; i < n; i++)
	{
		scanf("%1d",&z[i]); 
		total += z[i];
	}
	printf("%d", total);
	return 0;
}

 

처음의 풀이를 통해 공백없이 숫자를 입력하는데, 붙어있는 숫자가 따로따로 식별이 되어 결괏값에 어떻게 반영이 될 수 있을지에 대해 조금 고민을 하였고, 배열과 % 1d를 이용해 풀어봐야겠다는 생각이 떠올라 위의 코드를 작성하였다.

% 1d를 이용하면 어떠한 긴 수가 있을지라도 한자씩 나누어 입력을 받을 수 있게끔 해주는 서식 문자인데, 솔직히 이

% 1d를 코드에 작성하면서, 내가 머릿속으로 그린 그림이 맞을까 하는 의구심이 조금은 들었다.

 

<풀이 설명>

그래서 아래와 같은 코드를 작성해보고 내 나름의 테스트?를 조금 해보았다.

#include<stdio.h>
int main(void)
{
	int arr[100];
	int n;
	int i;
	scanf("%d", &i);
	
	for (n = 0; n < i; n++)
	     scanf("%1d", &arr[n]);
	
	printf("\n");
	
	for(n = 0; n < i; n++)
		printf("%d\n", arr[n]);
		
	return 0;
}

 

위의 코드를 실행시킨 결과인데 처음 입력값에 7을 넣어주었고, 1234567을 그다음 입력값으로 넣어주었다. 

그리고 각 배열요소값을 확인해주기 위해 출력을 해 주었다.

공백 없이 입력된 수들이 반복문과 %1d로 인해 하나씩 각 배열 요소의 값으로 입력이 된다고 생각하면 될 것 같다.

 

<다른 풀이>

#include<stdio.h>
int main(void)
{
	int n;
	char arr[101];
	int sum = 0;
	int i = 0;
	scanf("%d", &n);
	scanf("%s", arr);

	for (i = 0; i < n; i++) {
		sum += arr[i] - '0';
	}
	printf("%d", sum);
	return 0;
}

문자열 배열 arr을 선언해주었고, 입력될 숫자의 개수가 N (1 ≤ N ≤ 100)이므로 널문자까지 고려하여 [101]을 배열의 길이로 선언해주었다.

 

문자열의 입력은 공백 없이 각 배열 요소에 해당하는 값을 집어넣을 수 있으므로 % s를 통해 문자열을 입력받는다.

예를 들어, Good을 입력한다 할 때 배열의 첫 번째 요소에는 G, 두 번째 요소에는 o가 4번째 요소에는 d가 들어갈 것이라는 것이다.

 

char형은 문자형인데 정수형인 sum과 연산이 가능할까? 답은 가능하다. 컴퓨터 내에서도 아스키코드를 알고 있기 때문에 문자를 숫자로 알아서 인식을 해 10진수의 형태로 변환할 수 있다. 그런데 마지막에 문자 0 ('0') 은 왜 빼주는 것일까?

 

먼저, 우리가 문자열로 456을 입력하였다고 가정해보자. (위 코드에서 첫 번째 배열 요소 값부터 세 번째 배열 요소 값까지 반복문에 의해 연산이 될 것이다.) 

그러면 컴퓨터가 문자를 숫자로 인식하여 주니까,

문자 4는 4이고, 문자 5는 10진수 5이고 문자 6은 숫자 6일까? 그렇지 않다. 이것에 관한 것은 아스키코드표를 보면 단번에 알 수 있는데, 우선 문자 4는 십진수의 값으로 52이고 문자 5는 53, 문자 6은 54의 값으로 변환이 된다.

우리가 흔히 알고 있는 A의 아스키코드 값은 65 인 것처럼 위의 문자들도 아스키코드 값으로 변환이 된다는 것이다.

 

이것이 바로 마지막에 문자 0을 빼주는 이유이다. 문자 0은 48의 십진수 값을 가지고 있는데, 이 문자 0의 값을 빼주면 아스키코드값으로 변환된 숫자 형태를 띠고 있는 문자의 값들이 그 숫자 형태의 값으로 되는 것이다. 

예를 들자면, 문자 4는 52라고 하였다. 여기서 문자 0을 빼주면 52 - 48 = 4(십진수 값)처럼 된다는 것이다.

 

<소감>

이와 같은 연산들을 통해 위 문제를 해결해 볼 수도 있다. 두 가지의 풀이를 적었는데 첫 번째 풀이는 내가 생각해 낸 풀이이지만 두 번째 풀이는 다른 분들의 여러 풀이들을 보고 이해하려 노력한 풀이이다. 한 문제를 여러 방법으로 풀 수 있다는 게 재밌는 것 같다.