プログラマー1835写真
📖 目次
👆 リンク
🤞 質問する
👌 コード#コード#
🖖 に答える
🖐 Git gistアドレス
📌 リンク
https://programmers.co.kr/learn/courses/30/lessons/1835
📝 質問する
グループ写真を撮るためには、カカオフレンズのキャラクターがレンズの前に並んで立っていなければなりません.しかしニオはフロドと並んで立っていて、パイプに火をつけられたライアンはパイプから少なくとも3つ離れていることを望んでいた.
各ロールが自分の希望する条件を入力として受け取り、すべての条件を満たすことができる場合は、数値を計算するプログラムを作成します.
💻 コード#コード#
package programmers_1835_takeAGroupPhoto;
import java.util.*;
/*
*
* 프로그래머스
* 1835. 단체사진 찍기
* https://programmers.co.kr/learn/courses/30/lessons/1835
* 2021-05-13
*
* */
class Solution {
static String[] condition;
static int answer = 0;
static boolean visited[];
static Map<Character, Integer> friends;
static Map<Integer, Integer> line;
public int solution(int n, String[] data) {
answer = 0;
visited = new boolean[8];
friends = new HashMap<>();
line = new HashMap<>();
condition = data;
friends.put('A', 0);
friends.put('C', 1);
friends.put('F', 2);
friends.put('J', 3);
friends.put('M', 4);
friends.put('N', 5);
friends.put('R', 6);
friends.put('T', 7);
dfs(0);
return answer;
}
private void dfs(int order) {
if(order == 8) {
if(checkLogic()) answer++;
return;
}
for(int identity = 0; identity < 8; identity++) {
if(!visited[identity]) {
line.put(identity, order);
visited[identity] = true;
dfs(order + 1);
visited[identity] = false;
}
}
}
//조건체크 메소드
private boolean checkLogic() {
//데이터 추출
for(String data : condition) {
int obj1 = friends.get(data.charAt(0));
int obj2 = friends.get(data.charAt(2));
int order1 = line.get(obj1); //obj1의 순서
int order2 = line.get(obj2); //obj2의 순서
char op = data.charAt(3);
int value = data.charAt(4)-'0' + 1;
if(op == '=') {
if(Math.abs(order1 - order2) != value) return false;
}else if(op == '<') { //미만
if(Math.abs(order1 - order2) >= value) return false;
}else { //초과
if(Math.abs(order1 - order2) <= value) return false;
}
}
return true;
}
}
のり付け
👉 すべての場合、1つの数を迂回し、ローが条件に合致しているかどうかを確認します。
すべての場合の数は
8!
=40,320
であるため、閲覧によって完全に解決できる.1.指定された文字列からデータを割り当てる方法
👉 Mapオブジェクトを使用して各キャラクタに一致するCharacterとIntegerを格納し、文字列を読み込み、CharacterにマッピングされたInteger値に分割します。
▼各キャラクターの文字型と数字型を
friends
に格納する.friends.put('A', 0);
friends.put('C', 1);
friends.put('F', 2);
friends.put('J', 3);
friends.put('M', 4);
friends.put('N', 5);
friends.put('R', 6);
friends.put('T', 7);
Map<Character, Integer> friends
KeyValue
A
0
C
1
F
2
J
3
M
4
N
5
R
6
T
7
Value
は、各文字をInteger
型に分割するための数字である.なぜデジタルで保存しなければならないのか A C F J M N R Tを反復文に変換するためにデジタル型が便利です。 必ずmapに保存しなければならないのではないでしょうか。 そうだ。 char[] friends = {'A', 'C', 'F', 'J', 'M', 'N', 'R', 'T'}; 排解は関係ない。
▼
0~7
2番目のキャラクターを設定します.private void dfs(int order) {
if(order == 8) {
if(checkLogic()) answer++;
return;
}
for(int identity = 0; identity < 8; identity++) {
if(!visited[identity]) {
line.put(identity, order);
visited[identity] = true;
dfs(order + 1);
visited[identity] = false;
}
}
}
dfs(int order)
は0から7に回転し、line
にはidentity
とorder
が格納される.order
:nidentity
:どのロールが表示されますか💡
identity
=7
、order
=0
であれば、第1の0
である.T(7)
n番目の順序で出現する可能性のあるキャラクタのすべての状況の数を探索する.重複を防止するため、
for
で確認します.再帰関数を終了したら、
visited
を再度無効にします.visited
=order
日の場合、8人のロールが1列に並んでいるため、8
関数は所定の条件を満たしているかどうかをチェックします.checkLogic()
for(String data : condition) {
int obj1 = friends.get(data.charAt(0));
int obj2 = friends.get(data.charAt(2));
int order1 = line.get(obj1); //obj1의 순서
int order2 = line.get(obj2); //obj2의 순서
char op = data.charAt(3);
int value = data.charAt(4)-'0' + 1;
...
データがdata = (obj1)~(obj2)(op)(value)
の場合N~F=0
はN、data.charAt(0)
はFです.data.charAt(2)
では、キーがNのfriends
型データを検索し、int
に格納する.💡 すなわち、
obj1
およびobj1
は、カメラレンズをobj2
タイプに変換する変数である.2.条件の2つのキャラクタ間の距離をどのように知るか。
👉 2つのキャラクタの順序から減算された絶対値が表示されます。
▼条件を満たしていない場合は、バックで
int
をチェックします.if(op == '=') {
if(Math.abs(order1 - order2) != value) return false;
}else if(op == '<') { //미만
if(Math.abs(order1 - order2) >= value) return false;
}else { //초과
if(Math.abs(order1 - order2) <= value) return false;
}
注意事項
false
内でグローバル変数を初期化してこそ、正しく処理できます.理由がよくわからない
👩💻 Git gistアドレス
https://gist.github.com/ysyS2ysy/c91676d2fa524ff807081c7f4df1f4ae
Reference
この問題について(プログラマー1835写真), 我々は、より多くの情報をここで見つけました https://velog.io/@dtd1170/프로그래머스1835단체사진-찍기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol