큐 Queue

김소희·2023년 3월 17일
1

데일리코딩을 푸는데 이정도의 문제는 너무 쉽다는 생각이 들었다.
벌써 이정도 성장한건가 😊

		String input = "I Love you";
        String result = "";

        String[] arr = input.split(" "); 

        for(int i = 0; i<arr.length; i++){
            char charAt = arr[i].charAt(0);
            result += charAt;
        }
        System.out.println(result);
// 결과값 : ILY

오늘은 큐에 대한 기본적인 특징을 배우고 문제를 풀었다. java에서는 LinkedList만 지원하기때문에 배열을 큐로 만들려면 내가 새롭게 만들어 지정해야하는 번거로움이 있다고 한다.
지정해서 문제를 풀어보려고도 해봤는데 잘 되지 않아서 연결리스트를 사용했다.
문제를 이해해도 코드로 구현하는데 시간이 많이 들어서 주말오전까지 이틀이나 소요되긴 했지만 결국 해냈다는게 중요하지. 스스로가 대견스럽다.
도중에 생각한 값이랑 다른 결과가 나오거나 무한루프에 빠졌을때가 있었는데 디버깅을 이용해서 문제점을 발견했다.

<큐> Queue

큐도 스택과 마찬가지로 데이터를 쌓아두는 기본 자료구조이다.
하지만 스택과 달리 선입선출로 데이터를 꺼낸다.
1차선의 일방통행길이나 은행창구의 번호표 시스템, 마트에서 계산을 할때 큐와 비슷한 형태를 볼 수 있다.
큐에 데이터를 넣는건 인큐(en-queue), 꺼내는건 디큐(de-queue)라고 하고 프런트로 들어가서 리어로 나온다.

<큐 관련 메소드>
add/offer(): 큐의 프런트에 자료를 추가합니다.
여유공간이 없어서 add에 실패하면 IllegalStateException 오류 발생
peek(): 큐의 첫번째 값을 불러옵니다.
poll(): 큐의 값 하나를 지웁니다. 비어있을때 삭제하면 null 반환
remove(): 큐의 값 하나를 지웁니다. 비어있을때 삭제하면 예외 발생
clear(): 큐의 값을 전부 지웁니다.

문제 1. 박스포장
마트에서 장을 보고 박스를 포장하는데 폭이 좁아 한줄로 들어온다. 인원에 맞게 포장할 수 있는 기구들이 있으나 앞사람이 끝내지 못하면 기다렸다가 함께 나가야 한다. 최대 몇 명이 한꺼번에 나가는지 알아내시오.

	int[] boxes = new int[]{1, 5, 1, 4, 3, 6, 1, 1};

	Queue<Integer> queue = new LinkedList<>();
	for(int i=0; i<= boxes.length-1; i++){  //담음
		queue.add(boxes[i]);
	}
	int maxbox = 0;
	int waiting = 1;
	int maxwating = 0;
  
	Iterator<Integer> iter = queue.iterator(); // Iterator로 queue순회
	while(iter.hasNext()){					   // 다음값이 있는지 체크하고 순회
		int box = iter.next(); 				   // 박스개수

	if(maxbox<box) {                           // 맥스박스보다 크면
		if(maxwating<waiting){                 
			maxwating=waiting;
        }
	maxbox=box;                                
	waiting=1;
	}
	else if(maxbox>=box) {  				  // 맥스보다 작으면
	waiting += 1;
            }
        }
        if(maxwating<waiting){  
            maxwating=waiting;
        }

	System.out.println(maxwating);
// 결과값 : 4

문제2. 프린터 성능 구하기
프린터의 인쇄 작업 목록의 크기와 최대 용량을 가정하고 각기 다른 용량의 문서를 차례대로 인쇄하여 모든 문서가 인쇄되는데 최소 몇 초가 걸리는지 알아내시오.

  • 인쇄 작업 목록은 칸으로 이루어져 있다.
  • 각 칸에는 한 개의 문서만 위치할 수 있다.
  • 문서는 1초에 한 칸만 이동할 수 있다.
  • 인쇄 작업 목록의 크기는 bufferSize이고 최대 용량 capacities 만큼 문서를 담을 수 있다.
    int[] documents = new int[]{7, 4, 5, 6};
    int bufferSize = 2;
    int capacities = 10;

    Queue<Integer> queue = new LinkedList<Integer>(); //queue선언

	for(int i =0; i < bufferSize; i++){  // 칸만큼 0담음음
		queue.offer(0);
    }


    int sec = 0;
    int add = 0;
    int sum =0;
    
    //첫번째 작업은 하드코딩
	queue.poll();
	queue.add(documents[0]);
    documents=Arrays.copyOfRange(documents,1,documents.length);
    sec = 1;
    
    

// 방법 1 스트림으로 최대용량 확인 ---------------------------------------------

while(documents.length != 0 || (queue.stream().reduce(0, Integer::sum) != 0)) {
	if (documents.length != 0) { // 배열이 남아있으면
		sum = queue.stream().reduce(0, Integer::sum) + documents[0];
		if(sum > capacities){
			queue.poll();
			sum = queue.stream().reduce(0, Integer::sum) + documents[0];

			if(sum <= capacities) {
				queue.add(documents[0]);
				documents = Arrays.copyOfRange(documents, 1, documents.length);
				sec += 1;
			} else { 
			queue.add(0);
			sec += 1;
			}

		} else {
		queue.poll();
		queue.add(documents[0]);
		documents = Arrays.copyOfRange(documents, 1, documents.length);
		sec += 1;
		}
	} else { //배열이 다들어가면 끝까지 빼면시 시간카운트
	queue.poll();
	sec += 1;
	}
}



// 방법 2 이터레이터로 최대용량 확인------------------------------------------------

Iterator<Integer> iterator = queue.iterator();
while(documents.length!=0 || queue.size()!=0) { //배열요소가 있거나, 큐에 값이 있으면 실행

	add=0;
	iterator = queue.iterator();
	if (documents.length != 0) { //배열이 남아있으면
		while (iterator.hasNext()) {  //큐를 add에 할당
		add += iterator.next();
		}

		if (documents[0]+add > capacities){ // 용량체크
		queue.poll();
		add=0;
		iterator = queue.iterator();

		while (iterator.hasNext()) {  
		add += iterator.next();
		}

		if(documents[0] + add <= capacities) { //1개빼고 용량체크
			queue.add(documents[0]);
			documents = Arrays.copyOfRange(documents, 1, documents.length);
			sec += 1;
		} else { //1개빼도 용량초과면
		queue.add(0);
		sec += 1;
		}

	} else { 
	queue.poll();
	queue.add(documents[0]);
	documents = Arrays.copyOfRange(documents, 1, documents.length);
	sec += 1;
	}
	} else { // 배열이 다들어가면 끝까지 빼고 카운트
	queue.poll();
	sec += 1;
	}
}




System.out.println("소요시간 : "+(sec)+"초");
// 결과값 : 8초
profile
백엔드 자바 개발자 소희의 노트

0개의 댓글