본문 바로가기
공부/2024 항해99코딩클럽

99클럽 코테 스터디 3일차 TIL + 스택/큐/프로그래머스 기능 구현

by 푸딩코딩 2024. 5. 22.
728x90
반응형

1. 오늘의 학습 키워드


 

스택-LIFO

큐-FIFO 

 

 

2. 오늘의 학습 문제 


문제


 

https://school.programmers.co.kr/learn/courses/30/lessons/42586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드


import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        int[] answer = {};
        ArrayList<Integer> answerList = new ArrayList<>(); //형변환 위한 arrayList 
        
        int start=0; //100% 완료 프로그레스 검사용 변수
        int done=0; // 완료한 프로그레스 수
        
        while(done<progresses.length){
            start=done; 
            
            for( int k=done;k<progresses.length; k++) //speeds 만큼 progresses에 더해줌
                progresses[k] = Math.min( 100, progresses[k] +speeds[k]);
            
            int finish=0; //100%완료된 프로그레스 임시 저장 변수 
            if(progresses[start] == 100){ //현재 progresses의 완료된 것 이후부터 검사 
                while(start<progresses.length){
                    if(progresses[start]!=100) //100이 아니면 break
                        break;
                    done++;  start++; finish++;
                }
                if(finish!=0) //finish된 progresses가 존재하면 answerList에 add
                    answerList.add(finish);
            }
        }

        answer = answerList.stream().mapToInt(i -> i).toArray(); //arrayList to array 형변환
        return answer;
    }
}

 

순서대로 배포가 가능하기 때문에, 변수를 설정해 완려되지 않은 progresses에서 가장 앞의 progress부터 검사해 100인지 확인하고, 100이면 이후의 progress도 체크하고 완료한다. 

배열로 리턴해야하는데 배열의 크기를 정하기가 어려워서, 별도로 arrayList를 선언하여 add한 후 마지막에 형변환하여 리턴하였다. 

 

3. 오늘의 회고


 

노트에 경우를 따져보며 슈도코드를 작성해봤는데 도움이 되었다. 

스택/큐가 권장되는 문제인데 적용하지 않고 풀어서 풀이를 찾아보았다. 

 

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        
        Queue<Integer> queue = new LinkedList<Integer>();
        for(int i=0; i<progresses.length; i++) {
            queue.add((int) Math.ceil((100.0 - progresses[i]) / speeds[i]));
        }
        
        ArrayList<Integer> result = new ArrayList<Integer>();
        while(!queue.isEmpty()) {
            int value = queue.poll();
            int cnt = 1; //1일 부터
            
            while(!queue.isEmpty() && value >= queue.peek()) {
                cnt++;
                queue.poll();
            }
            result.add(cnt);
        }
        return result.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

출처 https://velog.io/@hong-brother/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B8%B0%EB%8A%A5%EA%B0%9C%EB%B0%9Cjava-%EC%8A%A4%ED%83%9D%ED%81%90

 

queue에 배포 날짜를 넣어준다. 

progress [93, 30, 55] 의 경우 queue [7, 3, 9] 가 들어간다. 

queue는 FIFO이므로 head부터 접근한다. 

poll()메소드는 head를 검색하고 큐에서 제거한다. 

peek() 메소드는 지정 순서 다음을 검색한다(제거하지 않음).

 

while문에서  처음 value=7, 

다음  while()에서 queue!=empty일때 queue.peek() 원소보다 크거나 같은지 검사한다. 

7>=3이므로 cnt++하고, queue.poll()로 head는 3이됨. 

다시 3<9이므로 while문 탈출하고 cnt=2를 result에 add

 

큐가 비어있지 않으니 큰 while문에서 다시 value=9가 되고, cnt=1을 result에 add

 

result=[2, 1]이고 array로 형변환 

 

모범 답안들을 보면 적절한 자료구조를 이용해 깔끔하게 푸는 것 같다.

나는 항상 먼저 for문을 써서 푸려고 하는데, 다양한 시도를 늘려봐야겠다. 

 

 

728x90
반응형