티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 10807번 개수 세기
https://www.acmicpc.net/problem/10807

 

10807번: 개수 세기

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

입력된 N개의 정수 중 v가 몇 개인지 출력
1) N [1 ~ 100]
2) N개의 정수 [-100 ~ 100]
3) 대상 v [-100 ~ 100]

 

2. 풀이 & 코드

저는 2가지 방식으로 풀어보았습니다.

 

1) 단순한 방식

문제의 입력 순서를 보면, N 개의 정수를 모두 입력받은 후 대상 v 를 알려줍니다.
따라서 단순하게 입력과 비교를 나누어 반복문을 2회 사용하여 아래와 같이 풀었습니다.
(1) N 개의 정수를 100개 짜리 배열에 0 부터 N - 1 까지 순차적으로 기록한다. (반복문 1회)
(2) 대상 v 를 입력 받고 0부터 N - 1 까지 순회하면서 v 와 같으면 Count 를 늘리고 출력한다. (반복문 1회)

이 풀이는 이해하기 쉽다는 장점이 있지만,
반복문을 불필요하게 2회나 사용한다는 단점이 있습니다.

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <cstdio>

const int LM = 100;
int a[LM + 5], N, x, v, cnt;

int main() {
	scanf("%d", &N);
	for (int i = 0; i < N; ++i) {
		scanf("%d", &x);
		a[i] = x;
	}

	scanf("%d", &v);
	for (int i = 0; i < N; ++i) {
		if (a[i] == v) ++cnt;
	}
	printf("%d\n", cnt);

	return 0;
}

 

2) Index 활용

반복문을 1회만 사용하기 위해서
배열에 [각 정수]가 아닌 [각 정수가 나온 횟수]를 기록하는 방식 구현해보았니다.

다시 말해 N개의 정수를 입력 받을 때 그대로 기록하는게 아니라,
각 Index 를 찾아가 해당 Index 에 있는 값에 + 1을 해둔 것 입니다.

그렇게 하면 마지막에 v 를 입력받았을 때 반복문을 순회할 필요 없이
그대로 해당 Index 의 값을 출력하면 됩니다.
(단, 정수의 범위가 -100 ~ 100 이므로 +100 을 해서 0 ~ 200 의 공간을 사용합니다)

예를 들어 1이 나오면 배열에 1을 그대로 기록하는게 아니라 Index 1 공간에 값을 +1 합니다.
(이 경우 + 100 을 하여 101번째 Index 에 +1)
2가 나오면 Index 2 공간의 값을 +1 하고
다시 1이 나오면 Index 1 공간의 값을 다시 +1 합니다. (두 번 더했으므로 이제 2)

N 개 정수를 위와 같이 처리한 뒤, 마지막에 v 를 입력받아 v 공간의 값을 출력하면 됩니다.


배열 Index 에 대한 이해와 위와 같은 방식의 활용은
초급자를 벗어나기 위해서 반드시 필요한 기본적인 역량입니다.
다소 어려울 수 있겠지만 2번째 구현까지 익히고 다음 문제로 넘어가시기를 추천드립니다.

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <cstdio>

const int LM = 201; // -100 ~ 100
int a[LM + 5], N, x, v;

int main() {
	scanf("%d", &N);
	for (int i = 0; i < N; ++i) {
		scanf("%d", &x);
		++a[x + 100];
	}

	scanf("%d", &v);
	printf("%d\n", a[v + 100]);

	return 0;
}

* 전역으로 선언한 int 형 변수의 초기값은 0 입니다.

728x90
반응형
댓글