カメラマンレベル2-4
13839 ワード
質問の概要:
秋になって、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の数である.
出力フォーマット
すべての条件を満たす数を返します.
サンプルI/O
n data answer
2 ["N~F=0", "R~T>2"] 3648
2 ["M~C<2", "C~M>1"] 0
実装コード:
dfsを用いて実施した.アクセスにより、名前が重複しないようにします.また,dfsを考慮すると木と見なすことができる.
Depthの後ろに横に行くとforゲートとしてだから初めてifゲートを回すのはnameslength()=7これをdepthと考えればいい値が7の場合にチェックします.
秋になって、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の数である.
出力フォーマット
すべての条件を満たす数を返します.
サンプルI/O
n data answer
2 ["N~F=0", "R~T>2"] 3648
2 ["M~C<2", "C~M>1"] 0
実装コード:
import java.lang.Math;
class Solution {
private String[] people = {"A", "C", "F", "J", "M", "N", "R", "T"};
private boolean[] visited = new boolean[8];
private int answer = 0;
public int solution(int n, String[] data) {
dts("", data);
return answer;
}
public void dts(String names, String[] data){
if(names.length() == 7){
if(check(names, data)){
answer++;
}
return;
}
for(int i = 0; i < 8; i++){
if(!visited[i]){
visited[i] = true;
String name = names + people[i];
dts(name, data);
visited[i] = false;
}
}
}
public boolean check(String names, String[] datas){
for(String data : datas){
int index1 = names.indexOf(data.charAt(0));
int index2 = names.indexOf(data.charAt(2));
char op = data.charAt(3);
int index = data.charAt(4) -'0';
if(op == '='){
if(!(Math.abs(index1-index2) == index + 1)){
return false;
}
}else if(op == '>'){
if(!(Math.abs(index1-index2) > index + 1 )){
return false;
}
}else if(op == '<'){
if(!(Math.abs(index1-index2) < index + 1)){
return false;
}
}
}
return true;
}
}
コードの説明:dfsを用いて実施した.アクセスにより、名前が重複しないようにします.また,dfsを考慮すると木と見なすことができる.
Depthの後ろに横に行くとforゲートとしてだから初めてifゲートを回すのはnameslength()=7これをdepthと考えればいい値が7の場合にチェックします.
Reference
この問題について(カメラマンレベル2-4), 我々は、より多くの情報をここで見つけました https://velog.io/@cse05091/프로그래머스Level2-4단체사진-찍기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol