티스토리 뷰
백준 온라인 저지(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 입니다.
'개발자 > 문제풀이 (C언어)' 카테고리의 다른 글
[백준/BOJ] 11650번 좌표 정렬하기 (C/C++) (0) | 2023.01.20 |
---|---|
[백준/BOJ] 5597번 과제 안 내신 분..? (C/C++) (0) | 2023.01.08 |
[백준/BOJ] 1927번 최소 힙 (C/C++) (0) | 2023.01.08 |
[백준/BOJ] 4307번 개미 (C/C++) (0) | 2022.12.05 |
[백준/BOJ] 25304번 영수증 (C/C++) (0) | 2022.11.26 |
- Total
- Today
- Yesterday
- 독서감상평
- 긴 자리 곱셈
- 긴 자리 덧셈 뺄셈
- 삼성전자
- 세상을 읽는 새로운 언어 빅데이터
- 동탄에듀센터
- JUNGOL
- 센터독서클럽
- 영화감상평
- 나의첫죽음학수업
- 호암의마지막꿈
- 안전운전특약
- 알고리즘
- 여가포인트
- 문현공
- 시대예보
- 관계가상처가되기전에
- 인간본성불패의법칙
- 동탄에듀센터2
- 최재천의공부
- 자료구조
- 나는늘잘해야한다고생각한다
- AdSendse
- 쿠프마케팅
- 당신도느리게나이들수있습니다
- 유연함의힘
- 독서 감상평
- 정세현의통찰
- 자동차보험
- 정올
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |