プログラマーLv.2-写真を合わせる
16316 ワード
質問する
秋になって、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の数である.
ぶんせき
ろんり
ろんり
必要な論理
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++;
}
}
Reference
この問題について(プログラマーLv.2-写真を合わせる), 我々は、より多くの情報をここで見つけました https://velog.io/@indongcha/프로그래머스-Lv.2-단체사진-찍기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol