Java構文とアルゴリズム(stack&queue 2)


知るところ

  • かっこの問題->スタックを多数使用します.
  • プロトタイプ問題使用->キュー.
  • Java queueメソッド
  •         Queue<Integer>queue=new LinkedList<>();
            queue.peek() // 제거를 안하고 맨 처음 값 
            queue.poll() // 제거하고 맨 처음 값
            queue.add(3) // 값을넣어준다. 
            // 보통 while문과 같이 사용
            while (!queue.isEmpty())  {
            	// 사용
            }

    問題1(必ずやり直してください)



    話題

  • 問題、スタック
  • の使用方法がわかりません
  • 分岐点を区分する簡単な方法
  • が必要である.
  • 括弧問題はStack問題で
  • に近い
  • インデックスにアクセスすると、すぐに後のメソッドがインデックスのサイズを超えていることがわかるので、すぐに前の(インデックス)、
  • が表示されます.

    解決策


    if(‘이면 stack에 push 
    else)’이면 pop을 하고 
    	if ) 레이저면 **[앞에 인덱스가 '('면 레이저]** -> stack 안에 ‘(‘ 개수를 count하고 answer+count 한다. 
        	else ) 닫는 괄호이기 때문에 stack에 있는 것 1개를 빼주고 answer+1을 더해준다.  

    コード#コード#

        public int solution(String str) {
            int answer=0;
            Stack<Character>stack=new Stack<>();
    
            // String -> char[]
            char arr[]=str.toCharArray();
    
            for (int i=0;i<arr.length;i++) {
                char s=arr[i];
                if (s=='(') {
                    stack.push(s);
                }
                // 닫는 괄호
                else {
                    // 레이저냐?
                    char prev=arr[i-1];
                    if (prev=='(') {
                        stack.pop();
                        answer+=stack.size();
                    }
                    else { // 마지막 막대기냐?
                        stack.pop(); // 닫아야 하기 때문에 pop 해주고 answer에는 1을 더해준다.
                        answer+=1;
                    }
                }
            }
            System.out.println(answer);
            return answer;
        }

    質問2(必ずやり直してください)



    話題

  • プロトタイプ問題->キューを使用します.
  • このときのコアは,プロトタイプが抽出した値を後に再接続し,プロトタイプを形成することである.従って、Queue
  • を用いる

    コード#コード#

    
    import java.util.*;
    
        public int solution(int n, int m) {
            int answer=0;
    
            Queue<Integer>queue=new LinkedList<>();
    
            for (int i=1;i<=n;i++) {
                queue.add(i);
            }
    
    
            while (!queue.isEmpty()) {
    
                // m-1개 뽑아서 뒤에 넣는다. // index역할을 대신한다.
                for (int i=0;i<m-1;i++) {
                    queue.offer(queue.poll());
                }
    
                // 마지막 꺼는 빼고 없애준다.
                queue.poll();
    
                // 만약 1개만 남았으면 종료 ->
                if (queue.size()==1) {
                    answer=queue.poll();
                }
            }
            System.out.println(answer);
            return answer;
        }

    質問です。


    話題

  • キューは
  • にインデックスアクセスできません.
    したがって,キューのfor文ではfor Eachを用いる.
  • javaのオブジェクト向けメソッドを使用して、キューに複数のパラメータ値を含める場合はclassを作成し、
  • を使用します.

    解決策

  • 病ヒト(idx,value)
  • を作成
  • キューに患者パラメータ値
  • を入力する.
  • Queueから抽出された値とfor文は、++と回答すると
  • 増加する.

    コード#コード#

    class Patient {
        int idx;
        int value;
    
        public Patient(int idx, int value) {
            this.idx = idx;
            this.value = value;
        }
    
        public int getIdx() {
            return idx;
        }
    
        public void setIdx(int idx) {
            this.idx = idx;
        }
    
        public int getValue() {
            return value;
        }
    
        public void setValue(int value) {
            this.value = value;
        }
    }
        public int solution(int n, int idx, int[]arr) {
            int answer=0;
    
            // Queue에 저장할때 idx하고 그 값을 저장하자
            Queue<Patient>queue=new LinkedList<>();
    
            for (int i=0;i<arr.length;i++) {
                Patient patient=new Patient(i,arr[i]);
                queue.offer(patient);
            }
    
            while (!queue.isEmpty()) {
                Patient patient=queue.poll();
                int idxx=patient.getIdx();
                int values=patient.getValue();
    
                // 다시 for문 돌아서 만약 큰게 있으면
                boolean check=true;
                int next_idx=0;
                int next_value=0;
                for (Patient p1:queue) {
                    next_idx=p1.getIdx();
                    next_value=p1.getValue();
    
                    if (values<next_value) {
                        check=false;
                        queue.add(patient);
                        break;
                    }
                }
                // 출력
                if (check) {
                    answer++;
                    if (idx==idxx) {
                        break;
                    }
                }
            }
            System.out.println(answer);
            return answer;
    
        }