[プログラマー]団体写真を撮る


回答日:2021年-08-11

質問する


質問リンク:https://programmers.co.kr/learn/courses/30/lessons/1835

アクセスと解析


与えられた配列{A,C,F,J,M,N,R,T}(それぞれ:ピッチ,Con,Prodo,Jazzy,Muzzy,Neo,Lion,Tube)を用いて並べ替えを行い,その順序がすべての条件を満たしているかどうかを調べることは容易な問題である.
条件は2人の友人間の距離に関するものであるため,各順序で条件に対応する友人同士の距離を求め,それらの間の人数を調べる.
シーケンスを実装する方法は様々であるが,C++のnext permutationを用いて実装した.

コード#コード#

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

using namespace std;

// 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요.
int solution(int n, vector<string> data) {
    vector<char> Friend{ 'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T' };
    int answer = 0;
    
    do {
        bool flag = true;
        for (string str : data) {
            char from = str[0], to = str[2];
            char op = str[3];
            int num = str[4] - '0';
            
            auto pos1 = find(Friend.begin(), Friend.end(), from);
            auto pos2 = find(Friend.begin(), Friend.end(), to);
            int diff;
            if (pos1 < pos2) {
                diff = pos2 - pos1 - 1;
            } else {
                diff = pos1 - pos2 - 1;
            }
            
            if (op == '=') {
                if (diff == num) {
                    continue;
                } else {
                    flag = false;
                    break;
                }
            } else if (op == '<') {
                if (diff < num) {
                    continue;
                } else {
                    flag = false;
                    break;
                }
            } else if (op == '>') {
                if (diff > num) {
                    continue;
                } else {
                    flag = false;
                    break;
                }
            }
        }
        if (flag == true) {
            answer++;
        }
    } while (next_permutation(Friend.begin(), Friend.end()));
    
    return answer;
}

結果



フィードバック


第2級の問題は確かに簡単だが、実施能力を育成できる良い問題のようだ.
もちろん、私のコードははっきりしていませんが、考えを最大限に符号化する練習がいいと思います.
コードをさらに簡略化し、アルゴリズムを調整して符号化する練習も必要かもしれません.