본문 바로가기
algorithm/Programmers

[JAVA] 기능 개발

by 이쟝 2023. 3. 30.

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

 

프로그래머스

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

programmers.co.kr

 

Queue 선언

Queue<Integer> queue = new LinkedList<>();

Queue 값 추가

  • add
    • 해당 큐 맨 뒤에 값 삽입
    • 값 추가 성공 시 true 반환
    • 큐 꽉 차면 IllegalStateException 에러 발생
  • offer
    • 해당 큐 맨 뒤에 값 삽입
    • 값 추가 성공 시 true 반환
    • 값 추가 실패 시 false 반환

Queue 값 제거

  • remove
    • 큐 맨 앞에 있는 값 반환 후 삭제
    • 큐 비어있으면 NoSuchElementException 에러 발생
  • poll
    • 큐 맨 앞에 있는 값 반환 후 삭제
    • 큐 비어있으면 null 반환
  • clear
    • 큐 비우기

Queue의 맨 앞 값 확인

  • element
    • 큐의 맨 앞에 있는 값 반환
    • 큐가 비어있으면 NoSuchElementException 에러 발생
  • peek 
    • 큐의 맨 앞에 있는 값 반환
    • 비어 있을 때 null 반환

 

1. ArrayList를 이용한 풀이

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> day = new ArrayList<>();
        ArrayList<Integer> answerList = new ArrayList<>();
       
        for(int i=0;i<progresses.length;i++) {
            day.add((int)Math.ceil(((double)100-progresses[i])/(double)speeds[i]));
        }
        
        int count = 1;
        int stuckDay = day.get(0); 
            
        for(int i=1; i<day.size(); i++) {
            // 중요도가 높은 기능이 개발되는 시간이 뒤에 있는 기능보다 거리는 시간이 많을때 갯수 만큼 배포되는 기능++
            if(stuckDay >= day.get(i)) {
                count ++;
            }else { // 뒤에 있는 일 수가 크면 앞에 있는 기능은 이미 배포된 상태 
                answerList.add(count); // 배포되는 기능 추가
                count = 1;  // 기능 개수 초기화
                stuckDay = day.get(i); // 다시 count하기 위해 stuckDay 현재 일수를 넣기
            }
        }
        answerList.add(count); // 마지막 일 수에 배포되는 기능 넣기
        
        int[] answer = new int[answerList.size()];
        for(int i=0;i<answer.length;i++){
            answer[i] = answerList.get(i).intValue();
        }
       
        return answer;
    }
}

 

  1. 먼저 각각의 기능들이 완료되는 데 걸리는 시간을 계산한 배열을 만든다.
    1. 속도로 남은 시간을 나누어 몇일이 걸리는지 계산한다. 1.1일이 걸렸다면 2일이 걸린 것이기 때문에 Math.ceil을 적용
  2. 기능은 항상 1개부터이기 때문에 count 변수 1로 초기화
  3. 비교하기 위해서 stuckDay안에 day의 첫 번째 인자를 넣는다.
  4. 몇 일째에 몇 개의 기능이 배포되는 지 구하기 위해 for문을 돌린다.
    1. 중요도가 높은 기능이 개발되는 시간이 뒤에 있는 기능보다 걸리는 시간이 많을 때, 개수 만큼 배포되는 기능 ++ (count ++)
    2. 그게 아닐 때는 answerList에 기능들을 다 추가
    3. 다시 처음부터 기능 배포해야 하기 위해 기능 개수 초기화
    4. 다시 기능을 count 하기 위해 stuckDay에 현재 일수를 넣기
  5. 마지막으로 배포되는 기능을 answerList에 추가

 

2. 똑같은 로직을 Queue를 이용한 풀이

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        
        Queue<Integer> queue = new LinkedList<>();
        List<Integer> answerList = new ArrayList<>();
        
        for(int i=0;i<speeds.length;i++) {
            double date = (100 - progresses[i]) / (double) speeds[i];
            int day = (int) Math.ceil(date);
            
            if(!queue.isEmpty() && queue.peek() < day) {
                answerList.offer(queue.size());
                queue.clear();
            }
            queue.offer(day);
        }
        answerList.add(queue.size());
        
        int[] answer = new int[answerList.size()];
    
        int count = 0;
        for(int i : answerList) {
            answer[count++] = i;
        }
        
        return answer;
    }
}

 

  • 요소 뒤의 값이 클 때까지 queue에 값을 추가하고 값이 뒤 보다 커질 때 answerList에 넣고, queue.clear()!
  • 향상된 for문을 사용할 때 answer[count++] = i 하게 되면 => answer[0] = i 다음에 count ++ 하는 것과 동일함!

  • queue를 이용하니까 훨씬 가독성이 좋아진 것 같다. 
  • 오류가 안생기는 offer, poll, clear, peek을 사용해야겠다.!!!!

'algorithm > Programmers' 카테고리의 다른 글

[JAVA] K번째 수  (0) 2023.03.31
[JAVA] 올바른 괄호  (0) 2023.03.31
[JAVA] 같은 숫자는 싫어  (0) 2023.03.29
[JAVA] 전화번호 목록  (0) 2023.03.29
[JAVA] 완주하지 못한 선수  (0) 2023.03.28