Programmers, 단체사진 찍기

2021. 12. 2. 17:34ㆍETC/Algorithm

λ°˜μ‘ν˜•

πŸ”— 문제 링크

 

문제 μ„€λͺ…

 

 

가을을 λ§žμ•„ μΉ΄μΉ΄μ˜€ν”„λ Œμ¦ˆλŠ” λ‹¨μ²΄λ‘œ μ†Œν’μ„ 떠났닀. 즐거운 μ‹œκ°„μ„ 보내고 λ§ˆμ§€λ§‰μ— 단체사진을 찍기 μœ„ν•΄ 카메라 μ•žμ— 일렬둜 λ‚˜λž€νžˆ μ„°λ‹€. 그런데 κ°μžκ°€ μ›ν•˜λŠ” λ°°μΉ˜κ°€ λͺ¨λ‘ 달라 μ–΄λ–€ μˆœμ„œλ‘œ 섀지 μ •ν•˜λŠ”λ° μ‹œκ°„μ΄ 였래 κ±Έλ Έλ‹€. λ„€μ˜€λŠ” ν”„λ‘œλ„μ™€ λ‚˜λž€νžˆ μ„œκΈ°λ₯Ό μ›ν–ˆκ³ , νŠœλΈŒκ°€ λΏœμ€ λΆˆμ„ λ§žμ€ 적이 있던 라이언은 νŠœλΈŒμ—κ²Œμ„œ 적어도 μ„Έ μΉΈ 이상 λ–¨μ–΄μ Έμ„œ μ„œκΈ°λ₯Ό μ›ν–ˆλ‹€. 사진을 찍고 λ‚˜μ„œ λŒμ•„μ˜€λŠ” 길에, λ¬΄μ§€λŠ” λͺ¨λ‘κ°€ μ›ν•˜λŠ” 쑰건을 λ§Œμ‘±ν•˜λ©΄μ„œλ„ λ‹€λ₯΄κ²Œ μ„œλŠ” 방법이 μžˆμ§€ μ•Šμ•˜μ„κΉŒ μƒκ°ν•΄λ³΄κ²Œ λ˜μ—ˆλ‹€. 각 ν”„λ Œμ¦ˆκ°€ μ›ν•˜λŠ” 쑰건을 μž…λ ₯으둜 λ°›μ•˜μ„ λ•Œ λͺ¨λ“  쑰건을 λ§Œμ‘±ν•  수 μžˆλ„λ‘ μ„œλŠ” 경우의 수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄λ³΄μž.

 

 

μž…λ ₯ ν˜•μ‹

μž…λ ₯은 쑰건의 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ nκ³Ό n개의 μ›μ†Œλ‘œ κ΅¬μ„±λœ λ¬Έμžμ—΄ λ°°μ—΄ data둜 주어진닀. data의 μ›μ†ŒλŠ” 각 ν”„λ Œμ¦ˆκ°€ μ›ν•˜λŠ” 쑰건이 N~F=0κ³Ό 같은 ν˜•νƒœμ˜ λ¬Έμžμ—΄λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€. μ œν•œμ‘°κ±΄μ€ μ•„λž˜μ™€ κ°™λ‹€.

  • 1 <= n <= 100
  • data의 μ›μ†ŒλŠ” λ‹€μ„― κΈ€μžλ‘œ κ΅¬μ„±λœ λ¬Έμžμ—΄μ΄λ‹€. 각 μ›μ†Œμ˜ 쑰건은 λ‹€μŒκ³Ό κ°™λ‹€.
    • 첫 번째 κΈ€μžμ™€ μ„Έ 번째 κΈ€μžλŠ” λ‹€μŒ 8개 쀑 ν•˜λ‚˜μ΄λ‹€. {A, C, F, J, M, N, R, T} κ°κ° μ–΄ν”ΌμΉ˜, 콘, ν”„λ‘œλ„, μ œμ΄μ§€, 무지, λ„€μ˜€, 라이언, 튜브λ₯Ό μ˜λ―Έν•œλ‹€. 첫 번째 κΈ€μžλŠ” 쑰건을 μ œμ‹œν•œ ν”„λ Œμ¦ˆ, μ„Έ 번째 κΈ€μžλŠ” μƒλŒ€λ°©μ΄λ‹€. 첫 번째 κΈ€μžμ™€ μ„Έ 번째 κΈ€μžλŠ” 항상 λ‹€λ₯΄λ‹€.
    • 두 번째 κΈ€μžλŠ” 항상 ~이닀.
    • λ„€ 번째 κΈ€μžλŠ” λ‹€μŒ 3개 쀑 ν•˜λ‚˜μ΄λ‹€. {=, <, >} κ°κ° κ°™μŒ, 미만, 초과λ₯Ό μ˜λ―Έν•œλ‹€.
    • λ‹€μ„― 번째 κΈ€μžλŠ” 0 μ΄μƒ 6 μ΄ν•˜μ˜ μ •μˆ˜μ˜ λ¬Έμžν˜•μ΄λ©°, 쑰건에 μ œμ‹œλ˜λŠ” 간격을 μ˜λ―Έν•œλ‹€. μ΄λ•Œ 간격은 두 ν”„λ Œμ¦ˆ 사이에 μžˆλŠ” λ‹€λ₯Έ ν”„λ Œμ¦ˆμ˜ μˆ˜μ΄λ‹€.

좜λ ₯ ν˜•μ‹

λͺ¨λ“  쑰건을 λ§Œμ‘±ν•˜λŠ” 경우의 수λ₯Ό λ¦¬ν„΄ν•œλ‹€.

 

예제 μž…μΆœλ ₯


n data answer
2 ["N~F=0", "R~T>2"] 3648
2 ["M~C<2", "C~M>1"] 0

 

μ˜ˆμ œμ— λŒ€ν•œ μ„€λͺ…

 

첫 번째 μ˜ˆμ œλŠ” λ¬Έμ œμ— μ„€λͺ…λœ 바와 같이, λ„€μ˜€λŠ” ν”„λ‘œλ„μ™€μ˜ 간격이 0이기λ₯Ό μ›ν•˜κ³  라이언은 νŠœλΈŒμ™€μ˜ 간격이 2보닀 크기λ₯Ό μ›ν•˜λŠ” 상황이닀.

두 번째 μ˜ˆμ œλŠ” 무지가 콘과의 간격이 2보닀 μž‘κΈ°λ₯Ό μ›ν•˜κ³ , λ°˜λŒ€λ‘œ μ½˜μ€ λ¬΄μ§€μ™€μ˜ 간격이 1보닀 크기λ₯Ό μ›ν•˜λŠ” 상황이닀. μ΄λŠ” λ™μ‹œμ— λ§Œμ‘±ν•  수 μ—†λŠ” μ‘°κ±΄μ΄λ―€λ‘œ 경우의 μˆ˜λŠ” 0이닀.

 

 

문제 ν•΄κ²°

[C++ ] next_permutation

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

using namespace std;

bool check(char ine, int dis, int cond) {
    if (ine == '=') {
        return dis == cond;
    } else if (ine == '>') {
        return dis > cond;
    } else {
        return dis < cond;
    }
}

int solution(int n, vector<string> data) {
    int answer = 0;
    string friends = "ACFJMNRT";
    
    do {
        for (string d: data) {
            char f1 = d[0], f2 = d[2];
            n = d[4] - '0';
            int dist = friends.find(f1) - friends.find(f2);
            if (!check(d[3], abs(dist)-1, n)) goto next;
        }
        answer++;
        next: {}
    } while (next_permutation(friends.begin(), friends.end()));
    
    return answer;
}

int main() {
    int result = solution(2, {"N~F=0", "R~T>2"});
    cout << "result : " << result << endl;
    return 0;
}

 

next_permutation 을 μ‚¬μš©ν•΄λ³Ό 수 μžˆμ—ˆλ‹€.

톡과 (406.76ms, 4.26MB)

 

 

[C++ ] DFS - Permutation

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#define FRIEND 8
using namespace std;

bool visited[FRIEND];
vector<char> selected;
string friends;
int answer;

bool check(char ine, int dis, int cond) {
    if (ine == '=') {
        return dis == cond;
    } else if (ine == '>') {
        return dis > cond;
    } else {
        return dis < cond;
    }
}

bool isValid(vector<string> data, string friends) {
    for (string d: data) {
        char f1 = d[0], f2 = d[2];
        int n = d[4]-'0';
        int dist = friends.find(f1) - friends.find(f2);
        if (!check(d[3], abs(dist)-1, n)) return false;
    }
    return true;
}

void dfs(vector<string> data, int cnt) {
    if (cnt == FRIEND) {
        string sel = "";
        for (char s: selected) sel += s;
        if (isValid(data, sel)) answer++;
        return;
    }

    for (int i=0; i < FRIEND; i++) {
        if (visited[i]) continue;
        visited[i]=true;
        selected.push_back(friends[i]);
        dfs(data, cnt+1);
        selected.pop_back();
        visited[i]=false;
    }
}

int solution(int n, vector<string> data) {
    answer = 0;
    friends = "ACFJMNRT";
    dfs(data, 0);
    return answer;
}

 

DFS둜 μˆœμ—΄μ„ μ‘°νšŒν•˜λ©° 체크할 μˆ˜λ„ μžˆλ‹€.

근데 μ„±λŠ₯은 next_permutation이  λ„˜μ‚¬λ‹€

 

톡과 (9266.66ms, 4.32MB)

 

 

 

 

 

 

 

λ°˜μ‘ν˜•

'ETC > Algorithm' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

programmers, 단속카메라  (0) 2021.12.03
Programmers, 섬 μ—°κ²°ν•˜κΈ°  (2) 2021.12.02
Programmers, μ§€ν˜• νŽΈμ§‘  (0) 2021.11.30
Programmers, 기지ꡭ μ„€μΉ˜  (0) 2021.11.29
Programmers, 배달  (0) 2021.11.29

Backend Software Engineer

Gyeongsun Park