문제 : https://www.acmicpc.net/problem/15969
15969번: 행복
모든 서브태스크에서 2 ≤ N ≤ 1,000이고 입력되는 학생들의 점수는 0 이상 1,000 이하의 정수이다.
www.acmicpc.net
문제 파악하기
N개의 학생들의 점수 중 최댓값과 최솟값을 찾아내는 문제입니다. 알고리즘을 공부하는 학생들이 가장 먼저 배우는 알고리즘이라고 할 수 있는 최댓값/최솟값 탐색 문제라고 할 수 있습니다.
문제 해결하기
최댓값과 최솟값을 찾는 방법에는 여러가지 있습니다. 다만, 이번 문제에서는 가장 기본적인 방법인 초깃값 설정 후 탐색을 통한 방법을 소개해드리겠습니다. N개의 숫자 중 최솟값과 최댓값을 찾기 위해서는 N개의 숫자를 살펴보면서 현재 숫자가 지금까지 확인한 숫자 중 최댓값인지 최솟값인지 판단하는 과정이 필요합니다. 이는 조건문을 통해 손쉽게 구할 수 있습니다. 만약 최댓값보다 현재 확인하는 숫자가 더 크다면 최댓값에 저장한 값을 현재 숫자로 바꿔주고, 반대로 최솟값보다 현재 확인하는 숫자가 더 작다면 최솟값에 저장한 값을 현재 숫자로 바꿔주면 됩니다.
다만, 이 알고리즘에서 중요한 건 초깃값 설정입니다. 최댓값과 최솟값을 저장하는 변수는 어떤 값으로 초기화해야 알고리즘에 영향을 미치지 않을까요? 바로 최솟값에는 엄청 큰 값, 최댓값에는 엄청 작은 값을 넣으면 됩니다. 여기서 말하는 엄청 큰 값과 엄청 작은 값은 알고리즘을 수행하면서 나올 수 없는 값들을 의미합니다. 이 문제의 경우, 학생들의 점수는 0~1000점 사이라고 합니다. 그렇다면 최솟값에는 학생들의 점수로 절대 나올 수 없는 엄청 큰 숫자로 1001을, 최댓값에는 나올 수 없는 엄청 작은 숫자인 -1로 초기화하면 됩니다. 물론 초기화하는 방법에는 여러가지 있다는 걸 기억하시길 바랍니다.
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int N, t; int vmax, vmin; int main() { // init vmax = 0; vmin = 1001; // solve scanf("%d", &N); for(int i=1;i<=N;i++) { scanf("%d", &t); if(t < vmin) vmin = t; if(t > vmax) vmax = t; } printf("%d", vmax - vmin); } | cs |
후기
정말 기본적인 알고리즘 문제입니다. 알고리즘에 대해 처음 배우는 사람에게 추천하고 싶은 문제입니다.
'문제 노트 > 정올' 카테고리의 다른 글
화살표 그리기( BOJ 15975 -고등 ) (0) | 2021.11.23 |
---|---|
화살표 그리기( BOJ 15970 - 초등 ) (0) | 2021.11.23 |
방 배정하기( BOJ 14697 ) (0) | 2021.11.23 |
딱지놀이( BOJ 14696 ) (0) | 2021.11.23 |
369 게임( BOJ 10802 ) (0) | 2021.11.20 |