Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 스프링 부트
- IntelliJ
- 주니어
- 해시맵
- 개발자
- 스프링
- docker
- 명령어
- 구름LEVEL
- spring boot
- 코딩테스트
- Java
- 배열
- dfs
- HTTP
- 해결
- spring
- 스타트업
- 도커
- Linux
- 스프링부트
- HashMap
- 프로그래머스
- 문자열
- 인텔리제이
- 백엔드
- bfs
- 구현
- 자료구조
- 이직
Archives
- Today
- Total
마이의 개발 블로그
[프로그래머스] 기능개발 (Java) 본문
반응형
작성 코드
1. 배포완료된 횟수가 주어진 progresses의 길이와 같을 때까지 반복한다(while문).
2. 한 번 반복 시 배포 완료된 작업을 제외하고, progresses에 speeds를 더한다.
3. 더해진 progresses를 체크하여 완료작업을 배포하고(count++), 완료되었음을 표시해준다(-1).
4. 한 회당 배포완료작업의 개수를 저장하고(list.add(count)), 전체 배포완료개수(countSum)에 더해준다.
//내가 작성한 코드
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
int countSum = 0;
int round = 0;
List<Integer> list = new ArrayList<Integer>();
while(countSum < progresses.length){
//작업속도 더해주기
for(int i=0; i<progresses.length; i++){
if(progresses[i] != -1) //배포 완료된 작업이 아닐 경우
progresses[i] += speeds[i];
}
int count = 0;
//완료작업유무 체크하기
for(int i=0; i<progresses.length; i++){
//이미 추가된 작업은 건너뛰기
if(progresses[i] == -1)
continue;
if(progresses[i] < 100) //미완료 작업일 경우 반복중지
break;
else{ //완료된 작업 배포 및 표시
count++;
progresses[i] = -1;
}
}
if(count > 0){
list.add(count);
}
countSum += count;
}
answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
무식하게 for문으로 풀었기 때문에 어려운 건 없었는데, 다른 사람들 풀이를 찾아보니 성능면에서 몇 가지 참고할만한 내용이 있어 비교해본다.
- 작업 완료에 필요한 소요일수를 먼저 계산한다.
- 계산된 소요일수를 Queue에 저장하고 사용한다.
//수정사항을 적용한 코드
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] answer = {};
Queue<Integer> queue = new LinkedList<>();
for(int i=0; i<progresses.length; i++){
queue.add((int) Math.ceil((100.0 - progresses[i])/speeds[i]));
}
List<Integer> list = new ArrayList<>();
while(!queue.isEmpty()){
int progress = queue.poll();
int count = 1;
while(!queue.isEmpty() && queue.peek() <= progress){
queue.poll();
count++;
}
list.add(count);
}
answer = new int[list.size()];
for(int i=0; i<list.size(); i++){
answer[i] = list.get(i);
}
return answer;
}
}
내 방식과 비교해봤을 때 이렇게 하면
1) 매번 progresses에 speeds를 더하는 연산을 줄일 수 있고,
2) 종료조건 체크를 위해 사용하던 countSum과 관련된 연산도 필요없어지는 것 같다.
고 생각해서 훨씬 효율적이겠거니 생각했는데... 막상 소요시간이 그렇게까지 크게 차이나진 않았다.
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 크레인 인형뽑기 게임 (Java) (0) | 2022.03.08 |
---|---|
[프로그래머스] 신고 결과 받기 (Java) (0) | 2022.03.05 |
[프로그래머스] 폰켓몬 (Java) (0) | 2022.03.05 |
[프로그래머스] 피보나치 수 (Java) (0) | 2022.03.03 |
[프로그래머스] 완주하지 못한 선수 (Java) (0) | 2022.02.24 |
Comments