본문 바로가기
코딩테스트 공부/Programmers

[C++] level2 단체사진 찍기 1835

by 메정 2021. 8. 24.

📌단체사진 찍기

/* 해당 문제 설명은 링크로 대체한다. */

📌풀이

이 문제는 {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() 함수로 빼서 인덱스를 가져오도록 수정하였다.

코테가 요정도 수준으로 나오면 참 좋을텐데 ~ ,....

댓글