[프로그래머스 level2] 단체사진 찍기 (C++)

조합을 통해 모든 경우의 수를 찾고 조건에 맞는지 찾는 문제이다. (프로그래머스 level2)

문제는 다음과 같다.
단체사진 찍기

처음에 봤을땐 확률과 통계 풀듯이 뭐 N과 F사이에 0을 넣어줘야되나? 뭐 이런 생각이 들었다.

하지만 이건 사람이나 할수있는 일이고
컴퓨터로는 모든 경우의 수에 대해서 조건만 맞는지 확인해주면 된다.

구현

  1. 입력받은 data를 따로 저장
  2. 조합으로 얻은 string 과 data의 조건이 일치한지 확인

C++ 문법

  1. 모든 조건을 찾는건 next_permutation() 을 사용하였다.
    next_permutation는 string에서도 잘 적용됨을 확인할 수 있다.
  2. string으로 입력될때 숫자도 문자임을 주의하자.
    0의 아스키코드는 48이다.
    int diff = nowStr[4]-48;

코드

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

using namespace std;

bool isRight(int diff, int real, char sign)
{
    if(sign == '=') return diff == real;
    else if(sign == '<') return real < diff;
    else if(sign == '>') return real > diff;
}
int solution(int n, vector<string> data) {
    int answer = 0;
    string friends = "ACFJMNRT";
    do{
        bool flag = true;
        for(int i=0; i<n; i++)
        {
            string nowStr = data[i];
            char f = nowStr[0];
            char s = nowStr[2];
            char sign = nowStr[3];
            int diff = nowStr[4]-48;
            
            int fIdx = -1, sIdx = -1;
            for(int j=0; j<8; j++)
            {
                if(friends[j] == f) fIdx = j;
                else if(friends[j] == s) sIdx = j;
            }
            int tmpDiff = abs(fIdx-sIdx)-1;
            if(!isRight(diff, tmpDiff, sign)) {
                flag=false;
                break;
            }
        }
        if(flag) answer++;
    }while(next_permutation(friends.begin(), friends.end()));
    return answer;
}

좋은 웹페이지 즐겨찾기