반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 문제
알파벳을 두개씩 묶어서 차집합과 합집합을 구해서 차집합/합집합을 구하는 문제다.
- 풀이
#include <string>
#include <vector>
#include <algorithm>
// #include <iostream>
using namespace std;
int solution(string str1, string str2) {
int answer = 0, front = 0, back = 0, idx1 = 0, idx2 = 0;
vector<string> v1, v2;
v1.reserve(1001);
v2.reserve(1001);
for(int i = 1; i < str1.size(); i++){
string temp;
if(isalpha(str1[i-1]) && isalpha(str1[i])){
temp.push_back(tolower(str1[i-1]));
temp.push_back(tolower(str1[i]));
v1.push_back(temp);
}
}
for(int i = 1; i < str2.size(); i++){
string temp;
if(isalpha(str2[i-1]) && isalpha(str2[i])){
temp.push_back(tolower(str2[i-1]));
temp.push_back(tolower(str2[i]));
v2.push_back(temp);
}
}
sort(v1.begin(), v1.end());
sort(v2.begin(), v2.end());
// for(auto i : v1){
// cout << i << ' ';
// }
// cout << '\n';
// for(auto i : v2){
// cout << i << ' ';
// }
while(1){
if(idx1 >= v1.size() && idx2 >= v2.size()){
break;
}
else if( idx1 == v1.size()){
back++;
idx2++;
}
else if( idx2 == v2.size()){
back++;
idx1++;
}
else if(v1[idx1] == v2[idx2]){
front++;
back++;
idx1++;
idx2++;
}
else if(v1[idx1] > v2[idx2]){
back++;
idx2++;
}
else if (v1[idx1] < v2[idx2]){
back++;
idx1++;
}
// cout << front <<' ' << back << '\n';
}
if(front == 0 && back == 0)
return 65536;
// cout << front << ' ' << back;
answer = (int)((double)front / back * 65536);
return answer;
}
먼저 v1이랑 v2는 연속된 두개의 문자가 알파벳이면 이를 추가해주는 방식으로 만든다.
이후에 정렬을 시켜서 사전순으로 이를 정렬시키고
사전순으로 정렬이 되었으니 더 문자열이 같을때만 차집합의 경우를 +1해주고
나머지에서는 합집합의 경우만 +1해준다.
- 기억할 것!
이거 차집합과 합집합이 둘 다 0일때만 1이 된다고 문제에 적혀 있었는데, 내가 생각했을때 차집합이 0이어도 1로 쳐야한다고 생각해서 차집합이 0일때도 1로 정답을 내도록 했었다.
하지만 5번과 13번 테스트 케이스의 경우에는 차집합이 0 일때도 65536을 출력하게 되면 실패가 뜨게 된다. 왜 이러는 지는 모르겠지만
차집합과 합집합 둘다 0일때만 65536을 출력하게 했더니 맞았다.
반응형
'Algorithm > 프로그래머스' 카테고리의 다른 글
프로그래머스 타겟 넘버 C++ (0) | 2022.10.22 |
---|---|
프로그래머스 프린터 C++ (0) | 2022.10.22 |
프로그래머스 기능개발 C++ (0) | 2022.10.22 |
프로그래머스 위장 C++ (0) | 2022.10.22 |
프로그래머스 n^2 배열 자르기 C++ (2) | 2022.10.22 |