📌단체사진 찍기
/* 해당 문제 설명은 링크로 대체한다. */
📌풀이
이 문제는 {A, C, F, J, M, N, R, T} 각각 어피치, 콘, 프로도, 제이지, 무지, 네오, 라이언, 튜브을 의미하는데 이들의 인덱스를 서있는 위치라고 생각하고, data의 조건에 따라 경우의 수를 맞춰 계산하면 된다! 순열에 경우의 수를 구해야 하므로 next_permutation을 이용해야 한다는 점을 기억!
그래서 우선 list라는 vector에 담아두고, data의 조건 해당하는 값의 index를 구하면 2명의 인덱스가 나오는데 이 두개를 뺀 값이 data의 조건 중 간격에 해당된다면 flag를 true로 두고 아니면 false로 둔다. //삼항연산자로 구현
그리고 for문을 나와 다시 순열을 구하기 전 flag값이 true라면 이 순열은 단체사진을 찍을 수 있는 조합이라는 의미로 answer++ 해주어 가능한 순열의 경우의 수를 구해 return 한다.
📌코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int findCharIdx(vector<char> v, char c){
int i;
for(i = 0; v.size(); i++){
if(c == v[i]) return i;
}
return -1;
}
void init(vector<char>& v){
v.push_back('A');
v.push_back('C');
v.push_back('F');
v.push_back('J');
v.push_back('M');
v.push_back('N');
v.push_back('R');
v.push_back('T');
}
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector<string> data) {
int answer = 0; //경우의 수
vector<char> list; //단체사진 찍을 사람들
init(list);
sort(list.begin(), list.end()); //오름차순 정렬
//next_permutaion을 이용하여 경우의 수 조합을 구함
do{
bool flag = false;
for(int i = 0; i < data.size(); i++){
//각 조건에 해당하는 사람(a, b)의 인덱스
int a = findCharIdx(list, data[i][0]);
int b = findCharIdx(list, data[i][2]);
//간격
int dist = (data[i][4] - '0') + 1; //숫자로 변환
if(data[i][3] == '='){
flag = (abs(a- b) == dist) ? true : false;
}else if(data[i][3] == '>'){
flag = (abs(a- b) > dist) ? true : false;
}else if(data[i][3] == '<'){
flag = (abs(a- b) < dist) ? true : false;
}
if(!flag) break;
}
if(flag) answer++;
}while(next_permutation(list.begin(), list.end()));
return answer;
}
회고
이번 문제는 next_permutation을 이용한다면 쉽게 풀 수 있다! 이 함수가 익숙해져서 괜찮아졌다.
처음에는 a와 b를 인덱스로 구하지 않고 char로 즉 문자로 받아왔는데 그렇게 하니까 뭔가 인덱스 값만 가져오는게 코드가 길어져 불필요하단 생각이 들어 findCharIdx() 함수로 빼서 인덱스를 가져오도록 수정하였다.
코테가 요정도 수준으로 나오면 참 좋을텐데 ~ ,....
'코딩테스트 공부 > Programmers' 카테고리의 다른 글
[C++] level2 소수 찾기 42839 (0) | 2021.08.31 |
---|---|
[C++] 5주차 위클리문제 사전모음 84512 (0) | 2021.08.31 |
[C++] 위클리챌린지 4주차 직업군 추천하기 84325 (0) | 2021.08.23 |
[C++] level2 땅따먹기 12913 (0) | 2021.08.22 |
[C++] level2 삼각달팽이 68645 (0) | 2021.08.22 |
댓글