(초록색 글자 클릭 시 문제로 이동)
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.
배열 A에 입력받으면서 동시에 출력하는 문제는 아니다. A에 저장한 후, 비교하는 게 가장 이상적이라 생각한다. 그래서 필자의 경우, 배열을 사용하여 문제를 풀었다.
이런 구조로 생각하면 보다 쉬울 것이다.
🚨 참고 🚨
그냥 풀이 할 수 있지만,C와 C++의 표준 입출력 동기화를 끊어주는 방법으로 진행하였다. 이번 문제에서는 입력과 출력이 번갈아 반복되므로 cin.tie(NULL)
도 함께 써준다.
자세한 설명은 15552번 풀이에 나와있다. (15552에 대한 설명 바로가기)
#include <iostream>
using namespace std;
int main()
{
cin.tie(NULL); //묶음해제
ios_base::sync_with_stdio(false); //동기화해제
int N, X, i;
//(1 ≤ N, X ≤ 10,000)이므로 배열크기도 N의 범위까지인 10,000
int arrA[10000];
cin >> N >> X;
//N만큼의 크기인 배열 A 입력받기
for (i = 0; i < N; i++) {
cin >> arrA[i];
}
//배열 A출력하기 위한 for문
for (i = 0; i < N; i++) {
//배열 A[0]~[N]까지 X보다 작은지 비교
if ( arrA[i] < X ) {
//공백과 함께 출력!
cout << arrA[i] << " ";
}
}
return 0;
}
초반에 이렇게 런타임에러가 계속됐다. 런타임에러의 원인은 OutOfBounds
OutOfBounds : 컨테이너 또는 배열에서 할당된 경계를 넘어가는 접근 발생
이걸 보고 1000이었던 배열크기가 너무 컸나 싶어 점차점차 10단위로 줄여나갔는데도 런타임에러는 해결되지 않았다. 무엇이 문제였던걸까?
런타임에러의 원인은 배열의 크기였다. 예시에서 10개를 했으니까 크기를 10으로 해야하나? 1000은 너무 큰가? 100으로 줄일까? 이런 나의 '주관적인' 생각으로 결정할 게 아니었다.
힌트는 문제 속에 있었다.
정수 N개로 이루어진 수열 A. (1 ≤ N, X ≤ 10,000)
수열 A, 즉 배열의 크기는 입력받은 N이었다. N은 1부터 10,000까지므로, 배열의 크기는 10,000으로 수정해줘야 한다. 수정하고 혹시나 했는데 바로 정답이었다.