프로그래머스 문제풀이(주식가격) with Java

mikseoo·2020년 3월 29일
1

아직 오프라인 개강까지 2주정도 남았다. 코로나19덕분(?)에 학교공부를 하기전에 나만의 공부를 할 시간이 좀더 생겼다. 학교 공부는 온라인강의와 과제만 충족하면 되기 때문에 평일에 과제와 강의를 다 수강하고 주말에는 내 공부하는데 시간을 보내려고 한다.

결국 SW마에스트로 11기 모집에서 코딩테스트에서 떨어지고 말았다. 예상된 결과였음에도 불구하고 맘이아팠다...

아직 웹프로그래밍 부분은 백지상태이고 그렇다고 알고리즘 코딩테스트 부분이 완전한것도 아니다.. 그래서 꾸준함이 가장 중요하다고 생각한다. 차근차근 코딩테스트 실력을 키워갈 것이다.

서론이 너무 길었다. 오늘은 프로그래머스 사이트에 스택&큐 문제인

주식가격문제 with JAVA

초 단위로 기록된 주식가격이 담긴 배열 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초간 가격이 떨어지지 않았습니다.
※ 공지 - 2019년 2월 28일 지문이 리뉴얼되었습니다.
  • 문제 내용은 이렇다. 숫자 배열이 주어지면 첫번째 인덱스에 저장된 수가 이후에 나오는 수보다 작아지는 거리(?)를 계산해서 answer 배열에 저장후 return 하는 문제이다.

우선 내가 작성한 코드는

java
 public static int[] solution(int[] prices) {
		        int[] answer = {};
		        answer = new int[prices.length];
		        int count =0 ;
		        for(int i=0;i<prices.length;i++) {
		        	for(int j=i+1;j<prices.length;j++) {
		        		
		        	
		        	if(prices[i]<=prices[j]) {
		        		count++;
		        	}
		        	
		        	
		        	}
		        	answer[i]=count;
		        	count = 0;
		        	System.out.println(answer[i]);
		        }
		        return answer;
		    }
		 public static void main(String[] args) {
			 int[] prices = {1,2,3,2,3};
			 solution(prices);
		 }
       

이렇게 인데 간단하게 작성을 했다.
배열을 인수로 받아오고 첫번째 데이터를 끝까지 비교한 후에 비교당하는 데이터가 비교하는 데이터보다 작거나 같으면 count를 1씩 증가시키고 배열의 끝까지 탐색을 완료하면 answer배열에 count값을 저장하고 count를 다시 초기화 시키는 것이다.

테스트를 통과해서 당연히 되겠지 하고 제출을 해보았다..
그결과....

......첫번째 케이스를 제외하고 다 실패가 되었다.

코드를 분석해 보니 인덱스0인 데이터가 바로다음 인덱스1데이터보다 크다면 1이나와야 하지만 count가 증가가 되지않고 저장되기 때문에 count가 0인 상태에서 저장이된다. 그래서 코드를 수정했다.

public static int[] solution(int[] prices) {
		        int[] answer = {};
		        answer = new int[prices.length];
		        int count =0;
		        for(int i=0;i<prices.length;i++) {
		        	for(int j=i+1;j<prices.length;j++) {
		        		
		        	
		        	if(prices[i]<=prices[j]) {
		        		count++;
		        	}
		        	else if(prices[0]>prices[1]) {
		        		count++;
		        		break;
		        	}}
		        	answer[i]=count;
		        	count = 0;
		        	System.out.println(answer[i]);
		        }
		        return answer;
		    }
  • 인덱스 0이 바로 인덱스 1인 데이터보다 크다면 count를 증가시키고 반복문을 종료시키는 것이다.

제출결과는

몇개 테스트가 더 통과했지만 여전히 실패가 너무 많다.

그래서 테스트 케이스를 추가해가면서 오류를 찾아보았다. 그러니 인덱스 0이 인덱스1보다 클때 뿐만아니라 바로 다음 인덱스의 데이터가 더 작을때마다 오류가 발견되었다. 그래서

 public static int[] solution(int[] prices) {
		        int[] answer = {};
		        answer = new int[prices.length];
		        int count =0;
		        for(int i=0;i<prices.length;i++) {
		        	for(int j=i+1;j<prices.length;j++) {
		        		
		        	
		        	if(prices[i]<=prices[j]) {
		        		count++;
		        	}
		        	else if(prices[i]>prices[j]) {
		        		count++;
		        		break;
		        	}}
		        	answer[i]=count;
		        	count = 0;
		        }
		        return answer;
		    }

else if문을 통해서 비교할 데이터가 크게되면 count를 증가시키고 반복문을 종료시키는 코드를 추가하였다.

그 결과... 드디어 통과 하였다.
예외처리의 중요성을 다시한번 느끼게된 문제였다. 항상 코드를 작성할때 예외처리가 중요한데 코드를 짤때는 예외경우를 잘 생각하지 못하는데 실행후 테스트케이스를 통해 예외를 짜게 된다. 그게 저번 SW마에스트로 코딩테스트에서 떨어지게 된 이유인거 같다.
실행은 잘되었지만 예외를 작성하지 않아서 내가 짠 코드가 맞다는 잘못된 확신 때문에 실질적으로 잘되지않는 코드를 짠것이다.

학교가 오프라인 개강을 하게되면 학교공부하느라 바빠서 개인 공부를 잘 못하게 되고 그렇게 되면 기존의 지식들도 다 까먹게 될까봐 차근차근 블로그에 정리를 해놔야겠다.

profile
초보 개발자 블로그

0개의 댓글