앞쪽에서 얻은 날짜를 기준으로, 100일을 넘길 수 있는 연속된 날짜를 구하는 문제.
import java.util.List;
import java.util.ArrayList;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
List<Integer> answer = new ArrayList<>();
int day = 0;
double val, div;
for (int i = 0; i < speeds.length; i++) {
if (progresses[i] + day * speeds[i] < 100) {
val = 100 - progresses[i];
div = val / speeds[i];
day = (int)Math.ceil(div);
answer.add(1);
} else {
answer.set(answer.size() - 1, answer.get(answer.size() - 1) + 1);
}
}
return answer.stream().mapToInt(i -> i).toArray();
}
}
List<Integer> answer = new ArrayList<>();
int day = 0;
double val, div;
값을 담을 answer와 날짜를 뜻할 day, 필요 진행도 val과 필요 진행도를 작업 속도로 나눈 div 선언.
for (int i = 0; i < speeds.length; i++) {
if (progresses[i] + day * speeds[i] < 100) {
val = 100 - progresses[i];
div = val / speeds[i];
day = (int)Math.ceil(div);
answer.add(1);
} else {
answer.set(answer.size() - 1, answer.get(answer.size() - 1) + 1);
}
}
주어진 작업의 갯수만큼 반복.
만약 작업 진행도 + 날짜 * 작업 속도가 100을 넘지 못 한다면, 필요 진행도 val를 구한 후 작업 속도로 나눈 div를 구한다.
div가 만약 3.47.. 이라면 4일이 더 있어야 100을 충족시킬 것이므로 div를 올림 후 day에 넣어준다.
해당 day를 기준으로 하나를 완료했으니 answer에 1을 넣어주자.
만약 현재 day에 특정 작업이 종료된다면, answer의 맨 마지막으로 가서 1을 올려주자.
return answer.stream().mapToInt(i -> i).toArray();
answer는 Integer List였기에 stream을 통해 반복가능한 형태로 만들고, mapToInt를 통해 내부 Integer 값을 int로 변환한다. 그 후 Array()를 통해 결과적으로 int array를 생성 후 반환.
Java보다 비슷하지만 상대적으로 비효율적인 코드.
def solution(progresses, speeds):
answer = []
days = 0
for i in range(len(speeds)):
if progresses[i] + speeds[i] * days < 100:
days += (100 - progresses[i] - speeds[i] * days) // speeds[i]
days += 1 if progresses[i] + speeds[i] * days < 100 else 0
answer.append(1)
else:
answer[-1] += 1
return answer
answer = []
days = 0
값을 담을 answer와 날짜인 days를 선언.
for i in range(len(speeds)):
if progresses[i] + speeds[i] * days < 100:
days += (100 - progresses[i] - speeds[i] * days) // speeds[i]
days += 1 if progresses[i] + speeds[i] * days < 100 else 0
answer.append(1)
else:
answer[-1] += 1
return answer
이 역시 작업 갯수만큼 반복한다.
만약 현재 날짜를 기준으로 작업 진행도가 100을 넘지 않는다면, 필요 진행도를 구하고 작업 속도로 나눠준 후 days에 더한다.
만약 그럼에도 불구하고 100을 넘지 않았다면, 소수점 이슈로 인한 것이므로 1일을 더 더해준다.
그 후 answer에 1을 추가.
만약 현재 날짜를 기준으로 작업 진행도가 100을 넘었다면, answer의 마지막에 1을 더해준다.
for문이 끝난 후 answer return.