Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C++로 배열에서 1, 2, 3이 모두 포함된 숫자를 오름차순으로 출력하는 방법


이 글에서 다룰 과제는 정수 배열 안에서 1, 2, 3이라는 숫자가 모두 포함된 원소를 찾아 오름차순으로 출력하는 것입니다. 만약 조건을 만족하는 숫자가 하나도 없다면 프로그램은 -1을 출력해야 합니다.

예시

입력 : arr[] = {320,123,124,125,14532,126,340,123400,100032,13,32,3123,1100}
출력 : 123 3123 14532 100032 123400

배열에 1, 2, 3을 모두 포함하는 값들이 존재하므로 -1을 반환하지 않고, 조건을 충족하는 5개의 값(123, 3123, 14532, 100032, 123400)을 출력합니다.

알고리즘

START
Step 1 → int 타입 원소를 갖는 배열 arr 선언
Step 2 → 배열의 크기를 int 변수 n에 저장
Step 3 → int 변수 one, two, three 선언
Step 4 → sort(arr, arr+n)을 호출해 배열을 오름차순으로 정렬
Step 5 → ostringstream 타입 변수 st와 string 변수 num 선언
Step 6 → i = 0부터 i < n까지 반복(++i)
    one = two = three = -1로 초기화
    st << arr[i]로 현재 숫자를 문자열 스트림에 저장
    num = st.str()로 숫자를 문자열로 변환
    one = num.find("1")
    two = num.find("2")
    three = num.find("3")
    IF ((one != -1) && (two != -1) && (three != -1))
        num 출력
    End
    st.str("")을 호출해 스트림 내용 초기화
end
STOP

C++ 구현 예제

#include <bits/stdc++.h>
#include<string.h>
#include<sstream>
using namespace std;
int main() {
    int arr[] = {320,123,124,125,14532,126,340,123400,100032,13,32,3123,1100};
    int n = sizeof(arr)/sizeof(arr[0]);
    int one,two,three;
    sort(arr, arr+n);
    ostringstream st;
    string num;
    for (int i = 0; i < n; ++i) {
        one=two=three=-1;
        st << arr[i];
        num=st.str();
        one=num.find("1");
        two=num.find("2");
        three=num.find("3");
        if((one!=-1)&&(two!=-1)&&(three!=-1)) {
            cout<<num<<" ";
        }
        st.str("");
    }
}

코드 설명

  • 정렬: sort(arr, arr+n)으로 배열을 먼저 오름차순 정렬하므로, 최종 결과 역시 항상 오름차순으로 출력됩니다.
  • 문자열 변환: ostringstream을 이용해 정수를 문자열로 바꾸면, 각 자릿수에 '1', '2', '3'이 포함되어 있는지 손쉽게 검사할 수 있습니다.
  • find() 함수: string::find()는 해당 문자를 찾으면 첫 번째 위치 인덱스를 반환하고, 찾지 못하면 -1을 반환합니다. 따라서 세 값이 모두 -1이 아니라는 것은 그 숫자에 1, 2, 3이 모두 들어 있다는 의미입니다.
  • 스트림 초기화: 매 반복마다 st.str("")을 호출해 이전에 저장된 값이 남지 않도록 합니다.

실행 결과

위 프로그램을 실행하면 다음과 같은 출력이 생성됩니다.

123 3123 14532 100032 123400