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

갭라·2021년 6월 27일
0

문제-단체사진 찍기

🤔문제 해석

어피치, 콘, 프로도, 제이지, 무지, 네오, 라이언, 튜브가 일렬로 줄을 선다
네오와 프로도는 나란히
라이언은 튜브에게서 적어도 세 칸 이상 떨어져 있게
모든 조건을 만족할 수 있도록 서는 경우의 수 구하기!

😏풀이

모든 경우의 수를 확인하는 것이니 next_permutation 함수를 사용할 것이다.
(algorithm 헤더 파일을 추가해야 한다)

사용법은 next_permutation/prev_permutation 사용법 참조

next_permutation: 현재 나와 있는 수열에서 인자로 넘어간 범위에 해당하는 다음 순열을 구하고 true를 반환한다. 다음 순열이 없다면(다음에 나온 순열이 순서상 이전 순열보다 작다면) false를 반환.

bool isRight 함수는 부호, 실제 거리, 만족해야하는 거리를 인자로 받아
만족하는지 bool로 return해주는 함수이다.

입력 data의 0,2번 인덱스는 프렌즈
3번 인덱스는 =,<,> 중 하나(같음,미만,초과)
4번 인덱스는 조건으로 제시되는 간격

조건들을 문자열에서 뽑아내어 isRight 함수를 통해 판별 후,
만족 시 그대로 진행,
else, next_permutation을 이용하여 다음 순열로 진행한다.

💻코드

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool isRight(char c, int diff, int num){
    if(c == '='){
        return diff == num;
    }else if(c == '>'){
        return diff > num;
    }else if(c == '<'){
        return diff < num;
    }
}

int solution(int n, vector<string> data) {
    int answer = 0;
    string friends = "ACFJMNRT";
    
    do{
        bool flag = true;
        for(string text : data){
            char ff = text[0]; // 프렌즈1
            char sf = text[2]; // 프렌즈2
            char comp = text[3]; //부호
            int num = text[4] - '0';
            int diff = friends.find(ff) - friends.find(sf); // 조건의 주체들 간 거리
	    int dis = abs(diff) - 1; //거리 양수로
        
            if(isRight(comp, dis, num)) continue; // 거리 조건 만족하면 continue
            flag = false; //아니면 flag를 false로 두고 break
            break;
        }
        if(flag) answer++;
    }while(next_permutation(friends.begin(), friends.end()));
    
    return answer;
}
profile
준비생!

0개의 댓글