-

[2017카카오코드본선] 단체사진 찍기 본문

1-3. 카카오 SW테스트

[2017카카오코드본선] 단체사진 찍기

asdklfjlasdlfkj 2020. 2. 6. 15:59

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

 

코딩테스트 연습 - 단체사진 찍기 | 프로그래머스

단체사진 찍기 가을을 맞아 카카오프렌즈는 단체로 소풍을 떠났다. 즐거운 시간을 보내고 마지막에 단체사진을 찍기 위해 카메라 앞에 일렬로 나란히 섰다. 그런데 각자가 원하는 배치가 모두 달라 어떤 순서로 설지 정하는데 시간이 오래 걸렸다. 네오는 프로도와 나란히 서기를 원했고, 튜브가 뿜은 불을 맞은 적이 있던 라이언은 튜브에게서 적어도 세 칸 이상 떨어져서 서기를 원했다. 사진을 찍고 나서 돌아오는 길에, 무지는 모두가 원하는 조건을 만족하면서도 다르게

programmers.co.kr

2017년 카카오 코드 본선 문제다.

친구들 8명의 위치에 대한 조합을 바꿔주면서 주어진 조건을 모두 만족시키는 경우의 수를 구하는 문제다.

단순히 모든 친구들을 벡터에 넣고 next_permutation으로 경우의 수를 확인해보면 되는 문제다.

떨어진 거리와 인덱스 간의 차-1이 동일한 것에 유의해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
 
// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector<string> data) {
    int answer = 0;
    vector<char> friends;
    friends.push_back('A');
    friends.push_back('C');
    friends.push_back('F');
    friends.push_back('J');
    friends.push_back('M');
    friends.push_back('N');
    friends.push_back('R');
    friends.push_back('T');
    sort(friends.begin(), friends.end());
    do{
        bool isOk = true;
        for(int i=0; i<data.size(); i++){
            char left = data[i][0];
            char right = data[i][2];
            char sign = data[i][3];
            int distance = data[i][4]-'0';
            int left_idx, right_idx;
            for(int j=0; j<8; j++){
                if(friends[j] == left){
                    left_idx = j;
                }
                if(friends[j] == right)
                    right_idx = j;
            }
            switch(sign){
                case '=':
                    if(abs(left_idx - right_idx)-1 != distance)
                        isOk = false;
                    break;
                case '<':
                    if(abs(left_idx - right_idx) - 1 >= distance)
                        isOk = false;
                    break;
                    
                case '>':
                    if(abs(left_idx - right_idx) - 1 <= distance)
                        isOk = false;
                    break;
            }       
            if(!isOk) break;
        }
        if(isOk) answer++;
    }while(next_permutation(friends.begin(), friends.end()));
    return answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

Comments