알고리즘 부셔버렷/ProblemSolving

[프로그래머스] 단체사진 찍기 (문제 설명, 해결 과정, 코드 전문, c++)

Unagi_zoso 2022. 6. 1. 02:39

 

  문제 설명

 

 

본 문제는 프로그래머스의 단체사진 찍기 문제입니다.

 

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

 

 

 

 

 

  해결 과정

data배열의 문자열에 인덱스로 접근하면 조건과 대상에 대해서 다룰 수 있습니다. 파싱한 듯한 결과가 됩니다.

next_permutation 함수를 통해 모든 순열에 접근하여 해당 조건에 하나라도 부적합할 시 그 횟수를 저장해

일어날 수 있는 총 순열의 갯수 40320 - 부적합 수 를 반환합니다.

 

 

 

 

 

  코드 전문

 

 

#include <string>
#include <vector>
#include <algorithm>
#include <cstdlib>

using namespace std;

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector<string> data) {
    string ka_friends = "ACFJMNRT";
    int false_cnt = 0;

    do
    {
        for (auto c : data)
        {
            int friend1_idx = ka_friends.find(c[0]);
            int friend2_idx = ka_friends.find(c[2]);

            int gap_two_friends = abs(friend1_idx - friend2_idx)-1;
            if (c[3] == '<')
            {
                if (gap_two_friends >= (c[4] - '0')) { false_cnt++; break; }
            }
            else if (c[3] == '=')
            {
                if (gap_two_friends != (c[4] - '0')) { false_cnt++;   break; }
            }
            else if (c[3] == '>')
            {
                if (gap_two_friends <= (c[4] - '0')) { false_cnt++; break; }
            }
        }
    } while (next_permutation(ka_friends.begin(), ka_friends.end()));
    return 40320 - false_cnt;
}

 

 

 

 

  느낀 점 (잡설 99% , 배운점 1%(많은 편))

 

더보기

vector에는 따로 find 함수가 없습니다. string이나 map에는 존재하는데 아쉽다. algorithm 라이브러리에도

find가 있긴 한데 적용해보니 에러만 왕창 나고 포기했다. abs는 cstdlib에 있는 함수이다. 

 

 

 

 

 

 

긴 글 읽어주셔서 감사합니다. 

부족한 점이 있다면 부디 알려주시면 감사하겠습니다.