1. 오늘의 학습 키워드
스택-LIFO
큐-FIFO
2. 오늘의 학습 문제
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42586
코드
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();
}
}
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문을 써서 푸려고 하는데, 다양한 시도를 늘려봐야겠다.
'공부 > 2024 항해99코딩클럽' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL + 힙/리트코드 [2336. Smallest Number in Infinite Set] JAVA 풀이 (0) | 2024.05.25 |
---|---|
99클럽 코테 스터디 5일차 TIL + 힙/ 프로그래머스 [더 맵게]/JAVA (0) | 2024.05.24 |
99클럽 코테 스터디 4일차 TIL + 스택/프로그래머스 [올바른 괄호] (0) | 2024.05.23 |
99클럽 코테 스터디 2일차 TIL + 해시/멀티해시맵/프로그래머스 의상 자바 풀이 (0) | 2024.05.21 |
99클럽 코테 스터디 1일차 TIL + 해시/전화번호 목록 (0) | 2024.05.20 |