プログラマーLv.2-写真を合わせる



質問する


秋になって、Kakaofriendsグループでハイキングに行きました.楽しい時間を過ごすために、最後に集合写真を撮って、カメラの前に一列に並んだ.しかし、誰もが望む構成が異なり、どの順番で設定するかを決めるのに時間がかかります.ニオはフロドと並んで立っていて、パイプに火をつけられたライアンはパイプから少なくとも3つ離れていることを望んでいる.写真を撮って帰る途中、武智はみんなの要求を満たす方法があるのではないかと考えた.すべての友人が自分の希望する条件を入力として受け取り、すべての条件が満たされている場合は、数字を計算するプログラムを作成します.
入力フォーマット
条件個数を表す整数nとn個の要素からなる文字列配列データを入力して与えます.dataの要素は同じ形式の文字列からなり,friendsごとに必要な条件はN~F=0である.制限条件は以下の通りです.
1 <= n <= 100
dataの要素は5文字からなる文字列です.各要素の条件は次のとおりです.
1番目と3番目の字は次の8つの字の1つです.{A、C、F、J、M、N、R、T}はそれぞれピッチ、CON、PRODO、JI、MOZY、ニオ、ライアン、救命輪を表す.最初の字は条件を出した友達で、3番目の字は相手です.最初の字と3番目の字はいつも違います.
2文字目はいつも~.
4番目の字は以下の3つの字の1つです.{=、<、>}は、それぞれ同じ、小さい、または超えを表す.
5番目の文字は0以上6以下の整数の文字型で、条件で与えられた間隔を表します.このとき、間隔は2つのfriends間の別のfriendsの数である.

ぶんせき


ろんり

  • は、人物対すべての状況の配列図(char[]resultAr)を作成する.
  • 人物配置図すべての配置条件(String[]data)がAnd条件を通過すると、結果値(int result)が増加する.
  • 必要な論理

  • 置換論理
  • 配置条件分析
  • 導入条件
  • package org.test.demo;
    
    import org.junit.jupiter.api.Assertions;
    import org.junit.jupiter.api.DisplayName;
    import org.junit.jupiter.api.Test;
    
    public class Picture {
        private final char[] KAKAO_FRIENDS = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'};
        private final boolean[] visited = new boolean[KAKAO_FRIENDS.length];
        private final char[] resultArr = new char[KAKAO_FRIENDS.length];
        private int result = 0;
    
        @Test
        @DisplayName("원하는 배치로 나올 수 있는 경우의 수가 3648이다")
        void takePicture(){
            int n = 2;
            String[] data = {"N~F=0", "R~T>2"};
            Assertions.assertEquals(3648, solution(n, data));
        }
    
        public int solution(int n, String[] data) {
            permutation(0, data);
            return result;
        }
    
        void permutation(int depth, String[] data){
            if(depth == KAKAO_FRIENDS.length){
                checkCommend(data);
                return;
            }
            for(int i = 0; i<KAKAO_FRIENDS.length; i++){
                if(!visited[i]){
                    visited[i] = true;
                    resultArr[depth] = KAKAO_FRIENDS[i];
                    permutation(depth + 1, data);
                    visited[i] = false;
                }
            }
        }
    
        void checkCommend(String[] data){
            for (String commend : data) {
                char to = commend.charAt(0);
                char from = commend.charAt(2);
                char compare = commend.charAt(3);
                int distance = commend.charAt(4) - '0';
                String resultStr = new String(resultArr);
                int toIndex = resultStr.indexOf(to);
                int fromIndex = resultStr.indexOf(from);
                int fromToDistance = Math.abs((toIndex - fromIndex)) - 1;
    
                switch (compare){
                    case '<':
                        if(!(fromToDistance < distance)) return;
                        break;
                    case '>':
                        if(!(fromToDistance > distance)) return;
                        break;
                    case '=':
                        if(!(fromToDistance == distance)) return;
                        break;
                }
            }
            result++;
        }
    }