본문 바로가기

백준/C++

[C++] 백준 3052번 - 나머지 && 백준 11720번 - 숫자의 합

728x90

 

문제 3052번

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

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

 

어제 풀었던 문제와 비슷하게 풀면 될 것 같다. 42로 나눈 나머지니까 0~41까지 나올 수 있다. 그러므로 크기가 42인 배열을 하나 만들어주고 각 입력값에 42를 나눈 나머지를 배열의 인덱스값으로 넣어 1씩 증가시켜준다. 그리고 배열에 들어있는 값이 0이 아니라면 count를 해준다. 그렇게 해주면 한 번 이상 나온 경우를 구할 수 있다. 

 

#include <iostream>
using namespace std;

int main() {
	int num[42] = {0};
	int A, count = 0;
	for (int i = 0; i < 10; i++) {
		cin >> A;
		num[A % 42]++;
	}
	for (int i = 0; i < 42; i++) {
		if (num[i] != 0) {
			count++;
		}
	}
	cout << count;

	return 0;
}

 

 

 

그런데 0이 아닌 개수를 count할 때 :를 사용하는 것이 더 좋은 것 같아서 내 풀이를 다시 고쳐봤다.

#include <iostream>
using namespace std;

int main() {
	int num[42] = {};	//공백이어도 0으로 초기화
	int A, count = 0;
	for (int i = 0; i < 10; i++) {
		cin >> A;
		num[A % 42]++;
	}
	for (int v:num) {

		if (v>0) {
			count++;
		}
	}
	cout << count;

	return 0;
}

 

 

 

 


 

 

문제 11720번

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

 

11720번: 숫자의 합

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

www.acmicpc.net

 

공백을 주지 않고 숫자를 입력받았기 때문에 string으로 입력받아서 각 자리수를 아스키 코드를 이용해 int로 변환하여 더해줬다(공백이 입력으로 들어오는 순간 문자열의 끝이라고 판단하여 입력을 받지 않음).

문자열 '0'의 아스키 코드는 48이므로 int로 변환하기 위해서는 -'0'또는 -48을 해주면 된다.

 

#include <iostream>
#include <string>
using namespace std;

int main() {
	int N, cnt=0;
	string s;
	cin >> N >> s;
	for (int i = 0; i < N; i++) {
		cnt += s[i] - '0';	//string을 int로 변환
	}
	cout << cnt;
	return 0;
}

 

 

 

 

 

만약 char로 받는다면 한글자씩 받는 것이니 string으로 받을 때처럼 s[i]하는 것이 아니라 다음과 같이 작성하면 된다.

#include <iostream>
using namespace std;

int main() {
	int N, cnt=0;
	char c;
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> c;
		cnt += c - '0';	//char형을 int로 변환
	}
	cout << cnt;
	return 0;
}

 

 

 

728x90