프로그래머스의 튜플(Lv2) 문제이다.
[ 문제풀이 ]
집합이 담긴 문자열 S를 통해서, 해당 배열의 원본 형태를 구해야 하는 문제이다.
문제를 보고 가장 거슬렸던 것은 입력이 String 형태로 주어진다는 것이였다.
매개변수로 들어오는 string 변수에는 '{' , '}' , ',' 와 같은 문자들 또한 모두 포함되어 있어서 가장 먼저 이러한 문자들을
걸러내주는 작업을 진행하였다. 동시에 튜플들 중에서 '숫자'만 뽑아서 Vector에 저장해 주었다.
Vector를 Vector배열 형태로 선언해서, 각 크기에 맞는 인덱스에 들어가도록 구현하였다.
즉, vector<int> V[510] 이런식으로 선언을 해서 관리해 주었다.
가장 첫 번째 예를 들어보자.
{ { 2 } , { 2 , 1 } , { 2 , 1 , 3 } , { 2 , 1 , 3 , 4 }} 가 입력으로 주어진다.
그럼 가장 먼저 걸러줘야 할 문자들을 걸러냄과 동시에, '{ }' 안에 있는 숫자들만 추출해내는 작업을 진행해주었다.
위의 예시라면, 가장 앞에 '{' 문자 2개를 걸러내면 숫자 '2'가 처음으로 등장한다. 그 이후에, ' } ' 에 의해서 하나의 튜플이
끝나게 된다.
그렇게 되면 V[0]에 '2'를 push해주는 것이다.
그 이후에 ' , ' 를 지나, ' { ' 를 지나고 숫자가 나오게되는데, 이 때부터 ' } ' 까지 있는 모든 숫자들을 Vector에 넣어주는 것이다.
즉, 숫자 '2'와 '1'이 V[1]에 push될 것이다. 물론, 2와 1 사이에 있는 ',' 또한 걸러내주었다.
이런식이라면, V[2] = { 2, 1 , 3 } , V[3] = { 2, 1, 3, 4 } 가 될 것이다.
이 후, 가장 크기가 작은 Vector Index부터 찾아주면 된다.
가장 처음에는 '1'개 짜리를 찾으면 되는 것이다.
그럼 V[0] 에 '2'하나만 존재하므로 V[0]가 나오게 될 것이고, 정답 배열의 가장 첫 번째 원소는 '2'가 된다.
그 이후, 2개 짜리를 찾아보자. 그렇게 되면 V[1] = { 2 , 1 } 로 크기가 2인 Vector Index에 해당하고, 이 원소들을 탐색할 때,
이미 '2'는 한번 계산이 된 원소이므로 넘어가고 '1'인 원소가 남게 되므로 정답 배열의 두번째 원소는 '1'이 되는 것이다.
말로 설명하니 굉장히 어렵게 느껴질 수 있는데 소스코드를 한번봐보자.
먼저 걸러줘야 할 문자들을 거르면서, 숫자들만 Vector에 저장하는 과정이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | vector<string> V[510]; int Idx = 0; for (int i = 1; i < s.length(); i++) { if (s[i] == '{') { string Temp = ""; int j = i + 1; while (1) { if (s[j] == '}') break; if (s[j] == ',') { V[Idx].push_back(Temp); Temp = ""; j++; continue; } Temp = Temp + s[j]; j++; } V[Idx++].push_back(Temp); } } | cs |
가장 먼저, ' { ' 괄호를 찾아서 탐색을 시작한다. 왜냐하면 숫자가 나오기 위해서는 ' { ' 가 필요하기 때문이다.
line9 ~ 21) 을 보게 되면, ' } ' 괄호를 찾을 때 까지 반복하는 반복문이다.
즉, '{' 괄호가 나온 시점부터, '}' 가 나올 때 까지 ','을 제외한 숫자들만 Vector에 push해주는 것이다.
Vector에 저장된 값들을 통해서 실제 정답 배열의 원소들을 추출하는 부분은 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | while (1) { bool Flag = false; for (int i = 0; i < Idx; i++) { if (V[i].size() == Len) { Flag = true; for (int j = 0; j < V[i].size(); j++) { int Num = stoi(V[i][j]); if (Visit[Num] == false) { Visit[Num] = true; answer.push_back(Num); } } Len++; break; } } if (Flag == false) break; } | cs |
가장 작은 사이즈를 가진 Vector부터 찾아다니면서, "이미 선택한 원소를 제외한 나머지 원소들을" 정답배열의 원소로 채택하는
과정이다.
[ 소스코드 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | #include<string> #include<vector> #include<algorithm> using namespace std; vector<int> solution(string s) { bool Visit[100010] = { false, }; vector<int> answer; vector<string> V[510]; int Idx = 0; for (int i = 1; i < s.length(); i++) { if (s[i] == '{') { string Temp = ""; int j = i + 1; while (1) { if (s[j] == '}') break; if (s[j] == ',') { V[Idx].push_back(Temp); Temp = ""; j++; continue; } Temp = Temp + s[j]; j++; } V[Idx++].push_back(Temp); } } int Len = 1; while (1) { bool Flag = false; for (int i = 0; i < Idx; i++) { if (V[i].size() == Len) { Flag = true; for (int j = 0; j < V[i].size(); j++) { int Num = stoi(V[i][j]); if (Visit[Num] == false) { Visit[Num] = true; answer.push_back(Num); } } Len++; break; } } if (Flag == false) break; } return answer; } | cs |
'[ Programmers Code ] > # PG - Level2' 카테고리의 다른 글
[ 프로그래머스 폰켓몬 (Lv2) ] (C++) (0) | 2020.05.05 |
---|---|
[ 프로그래머스 땅따먹기 (Lv2) ] (C++) (0) | 2020.04.28 |
[ 프로그래머스 숫자의 표현 (Lv2) ] (C++) (0) | 2020.04.21 |
[ 프래그래머스 다음 큰 숫자 (Lv2) ] (C++) (0) | 2020.04.19 |
[ 프로그래머스 올바른 괄호 (Lv2) ] (C++) (0) | 2020.04.19 |