이 글에서 다룰 과제는 정수 배열 안에서 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