-
[Algorithm] 프로그래머스 Lv2 기능개발 (42586)Etc./Algorithm 2021. 2. 19. 12:25
안녕하세요 rosepurple입니다. :)
오늘 푼 알고리즘 문제 풀이를 작성해보도록 하겠습니다!
문제
오늘은 아래 문제를 풀어봤습니다. (약 30분 소요)
programmers.co.kr/learn/courses/30/lessons/42586
풀이
그냥 직관적으로 풀었던 문제입니다.
ArrayList<Integer> answerList = new ArrayList<>(); int index = 0; int dayCount = 1; int remainFunctions = progresses.length;
answer의 길이를 문제 초반부터 알아내는 것은 불가능합니다. 그렇기 때문에 비교적 길이가 자유로운 ArrayList를 사용해서 answerList를 구성해준 후에 답을 return하기 전에 배열로 바꿔 return 해줬습니다.
index는 처음 기능부터 끝낸 후에 다음 기능으로 넘어가야하기 때문에 index를 지정해주어서 기능 개발이 끝나면 index를 더해주었습니다.
remainFunctions는 말 그대로 남은 기능의 개수입니다. 처음에는 모든 기능이 개발이 완료되지 않은 상태이므로 progresses의 길이로 초기화해주었습니다.
그 후에는 remainFunctions가 0이 될 때까지 while문 안에서 계속 순회해주었습니다.
if (progresses[index] + speeds[index] * dayCount < 100) { dayCount++; }
현재 개발중인 기능이 며칠이 걸리는지 구해주는 부분입니다.
개발이 100% 완료되지 않으면 날짜를 하루씩 추가해주었습니다.
int functions = 1; for (int i = index + 1; i < progresses.length; i++) { if (progresses[i] + (speeds[i] * dayCount) >= 100) { functions++; } else { break; } }
만약 개발중이었던 기능이 개발 완료 상태가 된다면, 완료된 기능 수를 1로 설정해줍니다.
그리고 다음 기능부터 마지막 기능까지 현재 날짜까지 개발했을 때 완료 여부를 체크해줍니다.
연속적으로 개발 완료가 가능하면 완료된 기능 수인 functions를 더해줍니다.
연속적인 개발 완료가 불가능하다면 break를 걸어 for문을 탈출해주었습니다.
answerList.add(functions); index += functions; remainFunctions -= functions;
그 후에는 리스트에 완료된 기능 수를 추가해주고 index를 완료된 기능 다음으로 설정해줍니다.
남은 기능 수에서 완료된 기능 수를 빼준 후 다시 while문을 순회합니다.
int[] answer = listToArray(answerList);
private int[] listToArray(ArrayList<Integer> answerList) { int[] answer = new int[answerList.size()]; for (int i = 0; i < answer.length; i++) { answer[i] = answerList.get(i); } return answer; }
return answer;
while문이 종료되었다면 리스트를 배열로 바꿔준 후에 답을 반환해줍니다.
전체 코드
class Solution { public int[] solution(int[] progresses, int[] speeds) { ArrayList<Integer> answerList = new ArrayList<>(); int index = 0; int dayCount = 1; int remainFunctions = progresses.length; while (remainFunctions > 0) { if (progresses[index] + speeds[index] * dayCount < 100) { dayCount++; } else { int functions = 1; for (int i = index + 1; i < progresses.length; i++) { if (progresses[i] + (speeds[i] * dayCount) >= 100) { functions++; } else { break; } } answerList.add(functions); index += functions; remainFunctions -= functions; } } int[] answer = listToArray(answerList); return answer; } private int[] listToArray(ArrayList<Integer> answerList) { int[] answer = new int[answerList.size()]; for (int i = 0; i < answer.length; i++) { answer[i] = answerList.get(i); } return answer; } }
마무리
노트에 문제 이해정도만 하고 바로 변수 선언하여 쭉 풀어나갔던 문제였습니다.
for문에 break를 걸지 않아서 몇번 오류가 나더라구요 ㅎㅎ
세밀한 포인트들을 잘 체크해주면 무난하게 풀 수 있는 문제라고 생각됩니다.
이번 포스팅도 읽어주셔서 감사합니다. :)
'Etc. > Algorithm' 카테고리의 다른 글
[Algorithm] 프로그래머스 Lv2 큰 수 만들기 (0) 2021.02.24 [Algorithm] 프로그래머스 Lv2 주식가격 (42584) (0) 2021.02.23 [Algorithm] 프로그래머스 Lv2 조이스틱 (42860) (0) 2021.02.19 [Algorithm] 프로그래머스 Lv2 프린터 (42587) (0) 2021.02.17 [Algorithm] 알고리즘 풀이 작성 시작! (2) 2021.02.17