일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Invalid property 'principal.username' of bean class
- 소수찾기 java
- redissonlock aop
- aop
- Spring Cloud Gateway
- jpa
- 멀티모듈 테스트컨테이너
- java
- interface
- ObjectOptimisticLockingFailureException 처리
- S3
- spring aop
- 백준
- AccessToken
- 알고리즘
- 낙관적 락 재시도
- springsecurity
- @transactional
- kotest testcontainers
- OptimisticLock
- netty
- 낙관적 락 롤백
- 형상관리
- DI
- ObjectOptimisticLockingFailureException
- TestContainers
- RefreshToken
- multimodule testcontainers
- 우아한 테크러닝
- spring DI
- Today
- Total
조급하면 모래성이 될뿐
[프로그래머스]주식가격 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42584
나의 풀이
우선 문제에 대한 간단한 설명을 하자면 i번째 금액이 언제 감소하느냐?이다.
그리고 문제를 이해하면 마지막 index의 값은 무조건 0일 수밖에 없다.
그래서 i번째부터 i < length-1까지 조회를 한다. ( length-1 값은 초기 값 0 그대로 둔다. )
마지막 index를 안 봐도 되는 이유는
1,2,3,2,0이라고 가정했을 때
1원의 가격이 떨어지는 시점은 마지막이고, 마지막까지 가야 결과를 알 수 있으니 4초 걸린다.
[ 1 -> 2,3,2,0 ]
2원의 가격이 떨어지는 시점도 마지막이고, 마지막까지 가야 결과를 알 수 있으니 3초 걸린다.
[ 2 -> 3,2,0 ]
1,2,3,2,3이라고 가정했을 때
1원의 가격이 떨어지는 시점은 없다, 결국 마지막까지 가보고 4초이다.
[ 1 -> 2,3,2,3 ]
2원의 가격이 떨어지는 시점도 없다, 결국 마지막까지 가보고 3초이다.
[ 2 -> 3,2,3 ]
즉, 마지막 INDEX는 무조건 가야 하기 때문에 결과는 동일하다.
그리고 비교조건은 i와 i+1부터 시작하지 않고, i와 i번째부터 시작을 하였다.
i부터 보게 됨으로써 마지막 index를 보지 않아도 자기 자신을 카운트하기 때문에 총 Cnt에 +1이 계산된다.
또, [ 1,2,3,2,3 ]의 경우에서 붉은색의 경우 3의 금액은 바로 다음에 떨어지는데, 첨부한 코드에서는 while의 조건을 현재 price보다 작은 값을 만나면 빠져나오게 되기 때문에 i+1부터 보면 Cnt를 증가할 수 없기 때문에도 있다.
코드
package Programmers.Level2;
import java.util.Arrays;
public class StockPrice {
public static void main(String[] args) {
int[] prices = {
3,3,3,3,1
};
int[] answer = solution(prices);
System.out.println(Arrays.toString(answer));
}//main
public static int[] solution(int[] prices) {
int[] answer = new int[prices.length];
for ( int i = 0 ; i < prices.length-1; i ++ ) {
int price = prices[i];
int j = i ;
int cnt = 0 ;
// 마지막 값은 무조건 0이기 때문에 초기 값 그대로 둔다.
// price값이 더 큰경우에 빠져나온다 !
// length -1 까지 보고 && 한칸차이로 떨어지는 경우가 존재하기때문에 j값은 i부터 시작.
while ( j < prices.length-1 && price <= prices[j] ) {
j++;
cnt++;
}
answer[i] = cnt ;
}
return answer;
}
}//class
제출 결과
2019-12-13 추가 풀이
: 복습하다 보니 처음에 너무 어렵게 푼 것 같다.. 프로그래머스의 다른 사람의 풀이를 참조하였다.
그냥 i번째 index부터 마지막 index까지 비교하면서, 현재 index보다 작은 값이 나오면 break 해준다.
그리고 떨어지지 않은 시간은 [ 이동한 위치의 index - 현재 index ]로 계산하면 쉽게 구할 수 있다.
1,3,3,3,0 이면
0번째 index 1의 값 처리할 때,
4번째 index 0의 값 일 때 떨어지고
4-0 하면 4초이다.
1번째 index 3의 값 처리할 때,
4번째 index 0의 값 일 때 떨어지고
4-3 하면 3초이다.
2번째 index 3의 값 처리할 때,
4번째 index 0의 값 일 때 떨어지고
4-2 하면 2초이다.
아래는 수정 한 최종코드이다. 간결하고 이해하기 쉽다..
public static int[] solution2(int[] prices) {
int[] answer = new int[prices.length];
for(int i = 0; i < prices.length; i++) {
for(int j=i+1; j < prices.length; j++){
answer[i] = j-i;
if(prices[i] > prices[j]) break;
}
}
return answer;
}
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스]큰 수 만들기 (0) | 2019.11.06 |
---|---|
[프로그래머스] 기능개발 (0) | 2019.11.05 |
[프로그래머스]쇠막대기 (0) | 2019.11.05 |
[프로그래머스] 124 나라의 숫자 (0) | 2019.11.05 |
[프로그래머스]다리를 지나는 트럭 (0) | 2019.11.04 |