본문 바로가기
  • 기록
알고리즘

[C++] 백준 11720번: 숫자의 합

by juserh 2022. 2. 7.

https://www.acmicpc.net/problem/11720

 

11720번: 숫자의 합

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

www.acmicpc.net

문제 이해하기

단계별 문제 중 '문자열'에 속해 있던 문제였는데, 나는 당최 어느 부분에서 문자열을 이용해야 하는지 이해할 수 없었다고 한다.....그래서 그냥 생각 없이(이러면 안되는데 말이야...) 막 코드를 작성하다가 알았다. 문제에서 중요한 것은 문제의 입력 부분에 '둘째 줄에 숫자 N개가 공백없이 주어진다' 는 조건이다. 

이렇게 공백 없이 숫자를 입력하고 이를 한 자리 한 자리 나눠서 숫자로 인식하려면, 입력받을 때 int타입으로 받으면 안된다. 

 

int input[100];
int sum=0;
for(int i=0; i<n; i++){
    cin >> input[i];
    sum+=input[i];
}
cout<<sum;

이렇게 int 타입으로 하면, 숫자를 enter 입력으로 구분하여 입력하게 되기 때문에 안된다.

 

그래서 char 타입을 사용해야 하고, 그래서 문자열 단계의 문제였던 것이다.......

 

코드로 표현하기

#include <iostream>

using namespace std;

int main() {
	int n;
	cin >> n;

	char ch[100]; //공백없이 하나씩 받아야 하므로
	int sum = 0;
	for (int i = 0; i < n; i++) {
		cin >> ch[i];
		sum += ch[i] - 48; //char형으로 받았으므로, 아스키코드 '0'의 값인 48을 빼줌 -> int타입으로 변환
		//sum += ch - '0';
	}
	cout << sum;
}

요로코롬....

아스키코드에서 숫자는 48부터 시작되기 때문에 입력받은 문자에 48 혹은 '0'을 빼주어야 int타입 숫자로 변환된다.

 

위에는 문자 배열을 사용했는데 굳이 배열에 저장할 필요는 없어보이고, 그냥 입력받은 거 합계에 더해주기만 해도 될 것 같음

#include <iostream>

using namespace std;

int main() {
	int n;
	cin >> n;

	char ch;
	int sum = 0;
	for (int i = 0; i < n; i++) {
		cin >> ch;
		sum += ch -48;
		//sum += ch - '0';
	}
	cout << sum;
}

 

'알고리즘' 카테고리의 다른 글

[C++] 백준 1712번: 손익분기점  (0) 2022.02.25
[C++] 백준 10809번: 알파벳 찾기  (0) 2022.02.07
[C++] 백준 1546번: 평균  (0) 2022.01.29
[C++] 백준 1110번: 더하기 사이클  (0) 2022.01.28
[C++] namespace  (0) 2022.01.18