programmers.co.kr/learn/courses/30/lessons/42586
이번에는 기능개발이라는 문제를 풀어서 그 기록을 작성해 보려고 한다.
스택과 큐에 관련된 문제라고 한다.
친절하게
LIFO, FIFO, push & pop! 스택과 큐를 이용해서 문제를 풀어보세요.
라고 해서 이번엔 스택을 꼭 사용해보리라 다짐하고 코드를 짰다.
어떻게 구현할지 머리속으로 생각하는 건 그리 어렵지 않았다.
다만, 스택을 많이 사용해보지 않아서 어떤식으로 작동하는지 syso로 계속 테스트 출력을 해보느라 푸는데 상당시간이 걸렸다.
내 코드의 순서를 간단히 정리하면
1. 각 기능들의 개발완료 일자를 stack에 차곡차곡 쌓는다.
2. 해당 스택의 완료일자들을 하나하나 비교해주면서 배포가능한 단위로 묶어서 list배열에 담는다.
3. 그리고 answer배열에 담아서 출력!
package com.level02;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class functionDevlopment {
public static void main(String[] args) {
int[] progresses = {99,99,99,99,99,99};
int[] speeds = {1,1,1,1,1,1};
solution(progresses, speeds);
}
public static int[] solution(int[] progresses, int[] speeds) {
Stack<Integer> stack = new Stack<Integer>();
// 개발 시간을 담는 스택
List<Integer> list = new ArrayList<Integer>();
// 배포 기능 개수를 담는 리스트 나중에 answer 배열로 담아서 리턴할 예정
int day = 0;
// 개발 완료 일자
for (int i = progresses.length-1; i >= 0; i--) {
// 작업의 배열 길이 만큼 반복문을 돌린다.
int tempProgresses = progresses[i];
// i번지의 작업을 잠시 담아두는 곳
while (tempProgresses < 100) {
// 해당 작업율이 100보다 작을 때 작업속도를 더하면서 반복하고, 개발완료일자를 ++해준다
tempProgresses += speeds[i];
day++;
}
stack.add(day);
// 개발 완료 일자를 스택에 더해준다.
day = 0;
// 다음 개발 일자를 계산하기위해 0으로 초기화.
}
int count = 1;
// 한번에 배포 가능한 단위
int temp = stack.pop();
// 맨위의 스택을 가져온다.
while(!stack.isEmpty()) {
// 스택이 비어있을때까지 반복한다.
if (temp >= stack.peek()) {
// 가져온 스택이랑 그다음 가장 맨 위의 있는 스택이랑 비교해서
// 가져온 스택이 더 크거나 같으면
stack.pop();
// 없애주고
count++;
// 카운트에 더해준다.
if (stack.size() == 0) {
// 만약에 스택이 비어있으면 멈춘다
list.add(count);
break;
}
} else {
list.add(count);
// 여기는 가져온 스택이 작은경우만 있으니 이때는 그냥 바로 list에 더해주고
count = 1;
// 개발개수 카운트를 1로 초기화한다.
if (stack.size() == 0) {
list.add(count);
break;
} else {
// 그리고 현재 가장 꼭 대기에 있는 개발일자를 temp에 다시 저장해주고, pop으로 날려준다.
temp = stack.peek();
stack.pop();
}
}
}
// answer 변수에 리스트로 가져온 기능배포개수를 담아준 후에 리턴!
int[] answer = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
평균 처리 속도는 15ms 느린거겠지...ㅠ
다른 분들 풀이 보면 약간 현타온다...
리스트와 람다식만 가지고 간단하게 코드를 구현하신 분도 계신다.
코드만 예쁘지 처리속도가 느리다는 것에 약간은 위로가 되긴 하지만,,,
어떤 분은 각각의 메소드들을 모듈화 하듯이 코딩하신 분도 계시더라...
난 일단 문제를 푸는데에만 집중했기에 ㅠㅠ 오늘도 하나 배워간다.
추후에는 모듈화 형태로도 구현해보리!
[깃허브]
'문제풀이 > 프로그래머스' 카테고리의 다른 글
다리를 지나는 트럭 / 프로그래머스 연습문제 / programmers / level2 / 스택,큐 / javascript (0) | 2021.05.09 |
---|---|
프린터 / level2 / 프로그래머스 연습문제 / programmers / 스택,큐 / java (0) | 2021.05.08 |
위장 / 프로그래머스 연습문제 / programmers / level2 / java (0) | 2021.05.06 |
전화번호 목록 / 프로그래머스 연습문제 / programmers / level2 / java (0) | 2021.05.05 |
로또의 최고 순위와 최저 순위 / 프로그래머스 연습문제 / programmers / level1 / JavaScript (0) | 2021.05.04 |