자료구조(3)

김민지·2023년 1월 12일
0

코딩테스트

목록 보기
17/31

11866

import java.io.*;
import java.util.ArrayList;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String input[] = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);
        ArrayList<Integer> list = new ArrayList<>();
        //1~n명의 사람이 있다고 가정한다. 그래서 미리 순열에 대한 list를 만들어두었다
        //중간idx의 삽입-삭제를 할수있는 자료구조를 선택하였다
        //삽입,삭제가 많은만큼 연결리스트가 더 효율적이라고 생각은 하지만
        //arraylist가 되는지안되는지를 보고싶었다.
        //입력 수 제한이 적어서 arraylist로도 가능한것같다
        for(int i=1;i<=n;i++){
            list.add(i);
        }
        //m이라는 값은 기억해두어야한다. 하지만 매번 삭제되는 list의 idx는 다를수밖에없다
        //그래서 따로 변수를 선언해주었다
        int idx = 0;
        //m-1을 해주는 이유는 0부터 3번쨰는 2이기때문이다
        //예를들어 idx=2가 삭제된 이후에도 +2를 해주어야 3번쨰인 값을 찾을 수 있기에
        //-1을 해주었다
        m = m-1;
        bw.write("<");
        while(list.size()>1){
            //일단 더해줍니다. while문안에들어있는 과정은 매번 반복될것이니
            // 매번 m칸씩 더해주는 코드를 넣고 그에따라 m이나 idx의 값을 설정해주었습니다
            //가령 0이나 m-1같은것들이요
            idx += m;
            //더하기만 하다보면 list.size를 초과할수있습니다. 그러기에
            //매번 size보다 작게 나머지연산을 해주었습니다
            // 123 을 생각해보면 4가나오면 1로 바꾸어줘야하고 5가 나오면 2로바꾸어줘야합니다
            // 456
            // 이는 순서와 상관있기때문에 나머지 연산으로 처리해줄 수 있습니다
            idx = idx % list.size();
            //remove를 하기 전에 값을 저장합니다
            int temp = list.get(idx);
            list.remove(idx);
            bw.write(temp + ", ");
        }
        bw.write(list.get(0) +">");
        bw.flush();
        bw.close();
    }


}

1966: 프린터 큐



import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

public class Main{
    //idx과 level두가지 변수르 담기 위해 node라는 class를 정의하였다
    public static class Node{
        int idx;
        int level;
        public Node(int idx, int level){
            this.idx = idx;
            this.level = level;
        }
    }
    public static int func(LinkedList<Node> q , int idx){
        int count =0;
        int bigIdx = 0;
        //q가 비어있다는것은 모두 프린터했다는뜻이다.
        //반복은 모두 프린터를 끝날떄까지, 즉 끝까지 반복을 돌린다
        while(!q.isEmpty()) {
            boolean isBig = false;
            //첫번재 원소를 얻는다
            Node cur = q.peek();
            //가장 level이 큰 원소에 대해 그 원소이전값들은 모두 빼서 뒤에 넣을것이다
            //그래서 가장 큰 원소를 기록하는 과정을 담았다
            //q.peek = q.get(0)일테니가 1부터 size-1까지 반복한다
            //그리고 이런식으로 한다면 1 4 2 3 이라는 순서라고 한다면
            //cur이 변화되지않기때문에 4앞인 1만 뒤로 돌려야하는데
            //3앞의 모든것을 뒤로 돌리게 돼서 문제가 발생한다
            //그래서 cur = q.get(i)코드가 필요하다
            for (int i = 1; i < q.size(); i++) {
                if (cur.level < q.get(i).level) {
                    isBig = true;
                    bigIdx = i;
                    cur = q.get(i);//이전에는 이 코드를 넣지 않아 문제가 발생했음
                }
            }
            //문제 대로 한다면 4를 출력했을때의 순서는 다음과 같을것이다
            //1 3 2 4
            //3 2 4 1
            //4 1 3 2
            //내 로직대로한대도
            //4 1 3 2
            //가장 큰 값을 찾아서 나머지를 그 큰값뒤에 차례대로 붙여주면되는것이다
            if(isBig){
                for (int k = 0; k < bigIdx; k++) {
                    //앞에서 하나빼서 뒤에 붙인다
                    Node temp = q.poll();
                    q.add(temp);
                }
            }
            //break문 앞에 count가 위치해야 pop한것의 개수까지셀수있다
            count++;
            q.pop();
            if(q.peek().idx == idx){
                break;
            }

        }

        return count;
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        for(int i=0;i<n;i++){
            LinkedList<Node> q = new LinkedList<>();
            String input[] = br.readLine().split(" ");
            int m = Integer.parseInt(input[0]);
            String lev[] = br.readLine().split(" ");
            for(int k=0;k<m;k++){
                q.add(new Node(k, Integer.parseInt(lev[k])));
            }
            bw.write(func(q, Integer.parseInt(input[1])) +"\n");


        }



        bw.flush();
        bw.close();
    }


}
profile
안녕하세요!

0개의 댓글