[programmers]英語のドラゴンボール


質問元:[programmers]英語でドラゴンボールを受け取り、https://programmers.co.kr/learn/courses/30/lessons/12981

👨‍🏫質問する


1番からn番までのn人は英語の言葉でドラゴンボールをしています英語のドラゴンボールのルールは以下の通りです.
  • 1番から、番号順に1人ずつ単語を話します.
  • 最後の人は単語を話して、それから1番から始めます.
  • 前の人が言った単語の最後の文字で始まる単語を言うべきです.
  • 以前に表示された単語は使用できません.
  • の単語は認められません.
  • 次は3人で言葉でドラゴンボールを遊ぶ場合です.tank → kick → know → wheel → land → dream → mother → robot → tank上の文字は次の操作を行います.
  • 1号人は最初の順番で戦車を話した.
  • 2番は自分の最初の順番で蹴ると言った.
  • 3番は初めてknowと言いました.
  • 1番の人は自分の2番目の車輪で話しています.
  • (続き)
  • 言葉の接頭辞を続けると、3番の人物が自分の3番目の順番で言ったtankという言葉は以前に出てきた単語だから淘汰されます.
    人の数nと人が順番に言った単語をパラメータとする場合は、解法関数を完了し、最初に淘汰された人の番号とその人が自分の何回目に淘汰された後に戻るかを求めてください.
    せいげんじょうけん
  • がドラゴンに参加した人数nは2以上10以下の自然数である.
  • 単語は、nまたは100以下の長さで順番に並べられた単語である.
  • 単語の長さは2または50以下です.
  • すべての単語は小文字です.
  • ドラゴンボールで使われている単語の意味は気にしないでください.
  • 正解は[番号、順番]で返してください.
  • 指定された単語に淘汰者がいない場合は、[0,0]を返します.
  • サンプルI/O


    nwordsresult3["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"][3,3]5["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"][0,0]2["hello", "one", "even", "never", "now", "world", "draw"][1,3]

    I/O例説明


    I/O例#1
    3人が接戦に参加した
  • 1号人:戦車、車輪、母
  • 2番:kick,land,robot
  • 3号人:know,dream,tank
  • 同じ順序で話すと、3人目が3回目に話すtankという言葉は、1人目が1回目に話すtankと同じなので、3人目が3回目に話すと、初めて淘汰者が現れる.
    I/O例#2
    5人が接戦に参加した
  • 1号人:hello,recein,合計
  • 2号人:観察、励まし、
  • 参照
  • 3号人:効果、保証、
  • 参照
  • 4号人:take,build,推定
  • 5号人:dong,hang,executive
  • 同じ順序で話す場合、この場合、与えられた単語だけを使っても淘汰者は現れない.したがって、[0,0]を返すことができます.
    I/O例#3
    2人は言葉のやりとりに参加した
  • 1号人:hello,even,now,draw
  • 2号人:one,new,world
  • 同じ順序で話すと、1番の人が自分の3番目の順序でnで始まるnowを「r」で始まる単語ではなく、nで始まるnowを話していると、最初の淘汰者が現れます.

    💻コード#コード#

    import java.util.ArrayList;
    
    class Solution {
        public int[] solution(int n, String[] words) {
            int[] answer = new int[2];
            ArrayList<String> list = new ArrayList<>();
            boolean flag = false;
            int count = 0;
            char before = words[0].charAt(0);
            
            for(int i = 1; i <= words.length; i++){
                String str = words[i - 1];
                
                // 첫 번째 사람일 때마다 count 증가
                if(i % n == 1){
                    count++;
                }
                
                /* 
                 * 이미 나온 단어이거나, 단어의 시작이 이전 단어에서 
                 * 이어지지 않는다면 반복문을 탈출한다.
                 */
                if(list.contains(str) || before != str.charAt(0)){
                    flag = true; 
                    
                    if(i % n == 0){
                        answer[0] = n;
                    }else{
                        answer[0] = i % n;
                    }
                    answer[1] = count;
                    break;
                }
                
                // 나오지 않은 단어일 경우 list에 추가
                before = str.charAt(str.length() - 1);
                list.add(str);
            }
        	
            
            // 중복된 단어가 나오지 않고 끝말잇기가 끝났다면, answer[]는 [0, 0]이 된다.
            if(!flag){
                answer[0] = 0;
                answer[1] = 0;
            }
            
            return answer;
        }
    }

    💡ポスト

    listに単語を1つ保存した後、重複する単語が出現したり、単語に接続できなかったりした場合は、残りの演算子を使用して適切な値を返すことができます.
    なぜlevel 2問題なのか分かりやすい問題ですが、話の終わりを考えずに、解答にまた5分ほどかかったようです.😅