본문 바로가기
Algorithm/프로그래머스

[프로그래머스]2017 카카오코드 본선 : 단체사진 찍기 (level 2)(c++)

by HBGB 2020. 5. 19.

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

 

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

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

programmers.co.kr

 

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

bool check(int order[], int n, vector<string> data)
{
    for (int i = 0; i < n; ++i)
    {
        string d = data[i];
        // 두 문자 위치 사이의 간격
        int distance = abs(order[d[0] - 'A'] - order[d[2] - 'A']) - 1;

        // 문제 조건에 일치하지 않으면 false
        if (!(d[3] == '=' && distance == d[4] - '0')
            && !(d[3] == '>' && distance > d[4] - '0')
            && !(d[3] == '<' && distance < d[4] - '0'))
        {
            return false;
        }
    }

    // 문제 조건이 모두 일치하면 true
    return true;
}

int solution(int n, vector<string> data) {

    char perm[8] = { 'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T' };
    int cnt = 0;

    // 오름차순 순열 -> 위치값 저장
    do {
        int order[26] = { 0, };
        for (int i = 0; i < 8; ++i)
        {
            order[perm[i] - 'A'] = i + 1;
        }

        // 해당 순열이 조건에 맞으면 cnt++
        if (check(order, n, data))
        {
            ++cnt;
        }

    } while (next_permutation(perm, perm + 8));

    return cnt;
}

 

 

순열을 브루트 포스로 풀이하면 된다

댓글