N

(프로그래머스 c++ KAKAO)단체사진 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)단체사진

naeunchan 2020. 11. 21. 21:48
728x90
반응형

문제 설명

단체사진 찍기

가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두 달라 어떤 순서로 설지 정하는데 시간이 오래 걸렸다. 네오는 프로도와 나란히 서기를 원했고, 튜브가 뿜은 불을 맞은 적이 있던 라이언은 튜브에게서 적어도 세 칸 이상 떨어져서 서기를 원했다. 사진을 찍고 나서 돌아오는 길에, 무지는 모두가 원하는 조건을 만족하면서도 다르게 서는 방법이 있지 않았을까 생각해보게 되었다. 각 프렌즈가 원하는 조건을 입력으로 받았을 때 모든 조건을 만족할 수 있도록 서는 경우의 수를 계산하는 프로그램을 작성해보자.

입력 형식

입력은 조건의 개수를 나타내는 정수 n과 n개의 원소로 구성된 문자열 배열 data로 주어진다. data의 원소는 각 프렌즈가 원하는 조건이 N~F=0과 같은 형태의 문자열로 구성되어 있다. 제한조건은 아래와 같다.

  • 1 <= n <= 100
  • data의 원소는 다섯 글자로 구성된 문자열이다. 각 원소의 조건은 다음과 같다.
    • 첫 번째 글자와 세 번째 글자는 다음 8개 중 하나이다. {A, C, F, J, M, N, R, T} 각각 어피치, 콘, 프로도, 제이지, 무지, 네오, 라이언, 튜브를 의미한다. 첫 번째 글자는 조건을 제시한 프렌즈, 세 번째 글자는 상대방이다. 첫 번째 글자와 세 번째 글자는 항상 다르다.
    • 두 번째 글자는 항상 ~이다.
    • 네 번째 글자는 다음 3개 중 하나이다. {=, <, >} 각각 같음, 미만, 초과를 의미한다.
    • 다섯 번째 글자는 0 이상 6 이하의 정수의 문자형이며, 조건에 제시되는 간격을 의미한다. 이때 간격은 두 프렌즈 사이에 있는 다른 프렌즈의 수이다.

출력 형식

모든 조건을 만족하는 경우의 수를 리턴한다.

 

 

next_permutation() 함수를 이용하여 순열을 계속 바꿔주도록 한다.

do~while문을 이용하여 next_permutation() 사용.

 

우선 순열을 바꿀 때마다 answer++을 해준다.

그리고 조건에 맞는지 검사하면서, 맞지 않는 경우는 answer--를 해주어 답을 구해내면 된다.

 

for문 설명.

우선 n개의 조건이 있으니 하나씩 검사하였다.

char형 front와 back은 각각 data[i][0], data[i][2]에 해당하는 문자이다.

즉, 조건의 캐릭터.

 

int형 count는 front와 back이 원하는 거리이다.

char형으로 들어와 있기 때문에 저장할 때에는 꼭 - '0'을 빼주어 int로 변환해주자..!

그리고 front, back이 character 벡터 안에 어디에 있는지 저장하는 인덱스이다.

 

dist는 character 벡터 안에서 front, back 캐릭터 사이의 거리를 나타낸다.

frontIndex와 backIndex를 대소비교하여 두 캐릭터 사이의 거리를 저장하였다.

 

이제 조건만 검사하면 된다.

3가지이기 때문에 각각의 문자에 맞게 if문 처리.

dist와 count가 각 조건에 맞으면, check = true.

맞지 않는 경우는 check = false로 바꿔준다.

 

if문이 끝나고 check 값을 검사하여 false인 경우는 조건이 맞지 않기 때문에 answer--를 해주고,

조건에 맞지 않는 경우는 다음 조건을 더 이상 검사하지 않아도 되기 때문에 break를 하여

다음 순열로 넘어가주면 된다..!

 

문제는 어렵게 느껴지지만 막상 파헤쳐보니 어렵지 않고, 쉽게 코딩할 수 있었던 문제다..!

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int solution(int n, vector<string> data) {
    int answer = 0;
    vector<char> character = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
    
    do
    {
        answer++;
        
        for(int i = 0; i < n; i++)
        {
            char front = data[i][0];
            char back = data[i][2];
            int count = data[i][4] - '0';
            int frontIndex = 0, backIndex = 0, dist = 0;
            bool check = true;
            
            for(int j = 0; j < 8; j++)
            {
                if(character[j] == front)
                    frontIndex = j;
                if(character[j] == back)
                    backIndex = j;
            }
            
            dist = frontIndex < backIndex ? backIndex - frontIndex - 1 : frontIndex - backIndex - 1;
            
            if(data[i][3] == '=')
            {
                if(dist == count)
                    check = true;
                else
                    check = false;
            }
            else if(data[i][3] == '>')
            {
                if(dist > count)
                    check = true;
                else
                    check = false;
            }
            else
            {
                if(dist < count)
                    check = true;
                else
                    check = false;
            }
            
            if(!check)
            {
                answer--;
                break;
            }
        }
    }while(next_permutation(character.begin(), character.end()));
    
    return answer;
}
728x90
반응형