[알고리즘/백준] 10871번 :: X보다 작은 수 (C++)

문제 ✍🏻 :: [10871번] X보다 작은 수

(초록색 글자 클릭 시 문제로 이동)

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.


알고리즘 (접근방법) 💻

배열 A에 입력받으면서 동시에 출력하는 문제는 아니다. A에 저장한 후, 비교하는 게 가장 이상적이라 생각한다. 그래서 필자의 경우, 배열을 사용하여 문제를 풀었다.

  1. 변수 정의, 배열 정의
  2. N과 X 입력받기
  3. 배열A를 입력받기
  4. 배열A 크기만큼 if문을 사용하여 X값과 비교하기

이런 구조로 생각하면 보다 쉬울 것이다.

🚨 참고 🚨
그냥 풀이 할 수 있지만,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으로 수정해줘야 한다. 수정하고 혹시나 했는데 바로 정답이었다.


회고 🤔

  • 배열을 쓰는 문제가 맞나? 아리쏭했다. 이 문제는 for문 파트인데 배열을 안 쓰고 어떻게 할까?
    그런데 어떤 문제든 겹칠 수 밖에 없다. 입출력에서도 if문이 나올 수도 있는 것. 그러니까 너무 단정지어서 국소적으로 생각하지말자.
  • 배열의 크기는 내 맘대로 정하지말고, 문제의 힌트에서 꼭 확인하자!
  • 오늘부로 for문 부분도 끝이 났다!!! 기분이가 좋다.

Reference

좋은 웹페이지 즐겨찾기