· 문제 설명
초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.
· 제한 사항
prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
prices의 길이는 2 이상 100,000 이하입니다.
· 입출력 예
prices | return |
[1, 2, 3, 2, 3] | [4, 3, 1, 1, 0] |
· 입출력 예 설명
1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.
· Thinking 1
0번 인덱스(i) 1은 뒤의 배열이 모두 1이상이기 때문에 끝까지(size-(i+1))초간 가격이 떨어지지 않음
1번 인덱스(i) 2는 뒤의 배열이 모두 2이상이기 때문에 끝까지(size-(i+1))초간 가격이 떨어지지 않음
2번 인덱스(i) 3은 뒤의 2때문에 1초간 가격이 떨어지고 다시 떨어지지 않기때문에(size-(i+1)-1)초간 가격이 떨어지지 않음
3번 인덱스(i) 2는 뒤의 배열이 모두 2이상이기 때문에 끝까지(size-(i+1)가격이 떨어지지 않음
4번 인덱스(i) 3는 뒤의 배열이 없기 때문에 가격이 떨어지지 않음
-> 이거는 그럼 인덱스 i를 기준으로 두고 그 이후의 인덱스 모두 비교 후 인덱스 i의 값보다 큰 값이 있으면 전체 사이즈에서 .. 빼주고
· Thinking 2
public int[] solution(int[] prices) {
int[] answer = new int[prices.length];
for (int i = 0; i < prices.length; i++) {
int cnt = 0;
for (int j = i+1; j < prices.length; j++) {
if (prices[i] > prices[j]) {
cnt++;
}
}
answer[i] = prices.length - (i+1) - cnt;
}
return answer;
}
처음 생각은 이렇게 했는데
정확성 : 6.7 / 효율성 : 0.0
일단 효율성에서는 포문을 두개 쓰면 안될듯
근데 그건 일단 이따 고치자...ㅠ;;
뭐가 문제지?
왜 테스트 케이스만 통과하지?
[10, 2, 4, 6, 2, 5] => [0, 4, 2, 0, 1, 0] 맞는데..
· Thinking 3
전체에서 빼는걸 생각하는게 아니라
작거나 같을때, 즉 떨어지지 않을때의 cnt를 담는..
for (int i = 0; i < prices.length; i++) {
int cnt = 0;
for (int j = i+1; j < prices.length; j++) {
if (prices[i] <= prices[j]) {
cnt++;
}
}
answer[i] = cnt;
}
도저히 모르겠음..
· 완성 코드
class Solution {
public static int[] solution(int[] prices) {
int[] answer = new int[prices.length];
for (int i = 0; i < prices.length; i++) {
int cnt = 0;
for (int j = i+1; j < prices.length; j++) {
if (prices[i] <= prices[j]) {
cnt++;
} else {
cnt += 1; //떨어지기까지 1초동안 유지되니까 그 시간을 더하고
break; //break문으로 빠져나오기
}
}
answer[i] = cnt;
}
return answer;
}
}
· 문제 출처
https://programmers.co.kr/learn/courses/30/lessons/42584
댓글