몇 가지 작업으로 구성된 Iterator 클래스를 설계해야 한다고 가정해 보겠습니다. -
- 정렬된 고유한 영문 소문자의 문자열 문자와 숫자 조합 길이를 매개변수로 사용하는 생성자를 정의합니다.
- 길이 조합 길이의 다음 조합을 알파벳 순서로 반환하는 함수 next()를 정의합니다.
- 다음 조합이 있는 경우에만 True를 반환하는 다른 함수 hasNext()를 정의합니다.
따라서 입력이 다음과 같으면 -
CombinationIterator iterator = new CombinationIterator("xyz", 2); iterator.next(); // returns "xy" iterator.hasNext(); // returns true iterator.next(); // returns "xz" iterator.hasNext(); // returns true iterator.next(); // returns "yz" iterator.hasNext(); // returns false
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 문자열의 배열 빗 만들기 및 인덱스 idx
- makeCombs() 메서드를 정의하면 문자열 s, 정수 변수 l, 임시 문자열(처음에는 비어 있음), 시작(처음에는 0)이 사용됩니다. 이는 다음과 같이 정의됩니다. -
- temp의 크기가 l이면 빗에 temp를 삽입하고 반환
- 범위 시작에서 s
- 까지의 i에 대해
- makeCombs(s, l, temp + s[i], i + 1)
- printVector() 메서드는 문자열 배열을 입력으로 사용하며, 해당 배열의 요소를 표시합니다.
- 다음과 같이 생성자를 정의합니다. 이것은 문자열 c와 cl을 사용합니다.
- makeCombs(c, cl) 호출, idx :=0으로 설정
- next() 메소드는 idx를 증가시키고 빗[idx - 1]을 반환합니다.
- hasNext() 메서드는 idx가 빗의 크기와 같지 않으면 true를 반환하고 그렇지 않으면 false를 반환합니다.
예(C++)
더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class CombinationIterator { public: vector <string> combs; int idx; void makeCombs(string s, int l, string temp ="", int start = 0){ if(temp.size() == l){ combs.push_back(temp); return; } for(int i = start; i < s.size(); i++){ makeCombs(s, l, temp + s[i], i + 1); } } void printVector(vector <string> v){ for(int i = 0; i < v.size(); i++){ cout << v[i] << "\n"; } cout << endl; } CombinationIterator(string c, int cl) { makeCombs(c, cl); idx = 0; } string next() { idx++; return combs[idx - 1]; } bool hasNext() { return !(idx == combs.size()); } }; main(){ CombinationIterator ob("xyz", 2); cout << (ob.next()) << endl; cout << (ob.hasNext()) << endl; cout << (ob.next()) << endl; cout << (ob.hasNext()) << endl; cout << (ob.next()) << endl; cout << (ob.hasNext()) << endl; }
입력
Initialize with “xyz” and 2, then call next() and hasNext() multiple times
출력
xy 1 xz 1 yz 0