プログラマー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> friendsKey
    Value
    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~72番目のキャラクターを設定します.
    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にはidentityorderが格納される.order:nidentity:どのロールが表示されますか
    💡 identity=7order=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