본문 바로가기
전공공부/코딩테스트

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

by 시아나 2022. 1. 11.

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

 

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

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

programmers.co.kr

 


나의 풀이

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

using namespace std;

bool check(int r_diff, int w_diff, char type) {
    if (type == '=') {
        return r_diff == w_diff;
    }
    else if (type == '<') {
        return r_diff < w_diff;
    }
    else {
        return r_diff > w_diff;
    }
}

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector<string> data) {
    int answer = 0;
    string names = "ACFJMNRT";
    do {
        bool flag = true;
        for (string str : data) {
            int man1 = names.find(str[0]);
            int man2 = names.find(str[2]);
            char type = str[3];
            int diff = str[4] - '0';
            int r_diff = man1 - man2;
            if (check(abs(r_diff) - 1, diff, type)) {
                continue;
            }
            flag = false;
            break;
        }
        if (flag) {
            answer++;
        }
    } while (next_permutation(names.begin(), names.end()));
    return answer;
}

 

처음 풀어보는 순열문제다

다른 사람의 풀이를 보다가 algorithm 라이브러리에 있는 next_permutation이라는 함수를 알게되었다.

 

순열을 순서대로 만들어주는 함수이다.

이와 함께 절댓값을 구하는 abs 함수도 알게되었다.

 

모든 순열을 만들고 data 조건에 들어맞는 문자열을 answer에 더하였다.