본문 바로가기

Algorithm/DFS

(C++) - 프로그래머스(2017 카카오 코드 본선) : 단체사진 찍기

반응형

programmers.co.kr/learn/courses/30/lessons/1835

 

코딩테스트 연습 - 단체사진 찍기

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두

programmers.co.kr

순열 구현문제였습니다.

 

풀이방법

 8!의 모든 순열을 확인하면서 data의 조건에 부합하는지를 확인하면 됩니다. 8! * 100 < 1억번 연산이므로 1초 이내로 문제를 해결할 수 있습니다. 따라서 next_permutation함수를 사용하면 됩니다.

 

Code

#include <bits/stdc++.h>
using namespace std;

bool isOk(string friends, char a, char b, char op, int num){
    int aIdx = friends.find(a), bIdx = friends.find(b);
    if(op == '=') if(abs(aIdx-bIdx) == num+1) return true;
    if(op == '>') if(abs(aIdx-bIdx) > num+1) return true;
    if(op == '<') if(abs(aIdx-bIdx) < num+1) return true;
    return false;
}

int solution(int n, vector<string> data) {
    int answer = 0;
    int cnt = 0;
    string friends = "ACFJMNRT";
    do{
        int flag = 0;
        for(auto d : data){
            char a = d[0];
            char b = d[2];
            char op = d[3];
            int num = d[4]-'0';
            if(!isOk(friends,a,b,op,num)) {flag = 1; break;}
        }
        if(!flag) answer++;
    }while(next_permutation(friends.begin(),friends.end()));
    return answer;
}