반응형

https://programmers.co.kr/learn/courses/30/lessons/42584

 

코딩테스트 연습 - 주식가격

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요. 제한사항 prices의 각 가격은 1 이상 10,00

programmers.co.kr

문제 풀이에서 제일 어려웠던 부분은 

마지막 가격이 유지 안됬을 때의 예외 처리였습니다. 

테스트 케이스를 돌리면 한 끗차리로 결과가 맞지 않았습니다. 

이번에 풀면서 느낀 건 문제를 종이에 써가면 이해하려고 하니 조금 더 이해가 쉽게 되었다. 

마치 손으로 디버깅 하듯이 문제를 풀어 나갈 수 있어서 좋았던거 같습니다. 

앞으로 문제를 깊이 있게 이해하려는 노력을 해야겠습니다.

package com.ji.study;

import static org.junit.Assert.assertEquals;

import org.junit.jupiter.api.Test;

public class StockPriceTest {
	@Test
	void test() {

		StockPrice test = new StockPrice();

		assertEquals(new int[] { 4, 3, 1, 1, 0 }, test.solution(new int[] { 1, 2, 3, 2, 3 }));
		assertEquals(new int[] { 2, 1, 1, 0 }, test.solution(new int[] { 498, 501, 470, 489 }));

	}

}
public static int[] solution(int[] prices) {
		int[] answer = new int[prices.length];
		int count = 0;

		for (int i = 0; i < prices.length - 1; i++) {
			count = 0;
			for (int j = i + 1; j < prices.length; j++) {
				if (prices[i] <= prices[j]) {
					count++;
				} else {
					// 반대의 경우 값 유지 했기 때문에 count
					count++;
					break;
				}
			}
			answer[i] = count;
		}

		// 마지막 가격에 대한 상승/하강은 검사할 필요없음!!
		answer[prices.length - 1] = 0;

		return answer;
	}

728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[프로그래머스] 프린터  (0) 2021.05.07
[백준] DFS와 BFS  (0) 2021.05.01
[프로그래머스] 타겟 넘버  (0) 2021.04.25
[프로그래머스] 다리를 지나는 트럭  (0) 2021.04.20
[프로그래머스] 소수 찾기  (0) 2021.04.20
반응형

1. jpql

String jpql = "select a from AccountLog a where ";
if (!vo.getSearchType().equalsIgnoreCase("all"))
jpql += JpqlQueryUtil.getWhereQueryByFileName(vo.getSearchType());

jpql += " a.logTime >= :startDate and a.logTime <= :endDate";

TypedQuery<AccountLog> typedQuery = em.createQuery(jpql, AccountLog.class);

if (!vo.getSearchType().equalsIgnoreCase("all")) {
typedQuery.setParameter("searchWord", vo.getSearchWord());
}

typedQuery.setParameter("startDate", DateUtils.parseDateFormatHHMMSS(vo.getStartDate() + " 00:00:00"));
typedQuery.setParameter("endDate", DateUtils.parseDateFormatHHMMSS(vo.getEndDate() + " 23:59:59"));

result = typedQuery.setFirstResult(vo.getPageNumber() - 1)
				   .setMaxResults(vo.getPageSize())
				   .getResultList();

2. QueryDSL

JPAQuery query = new JPAQuery(em);
QAccountLog accountLog = new QAccountLog("accountLog");

Date startDate = DateUtils.parseDateFormatHHMMSS(vo.getStartDate() + " 00:00:00");
Date endDate = DateUtils.parseDateFormatHHMMSS(vo.getEndDate() + " 23:59:59");

com.querydsl.core.types.Predicate condition = makeWhereQuery(vo, accountLog, startDate, endDate);

FetchableQueryBase queryBase = (FetchableQueryBase) query.from(accountLog)
														.where(condition)
                                                        .limit(vo.getPageSize())
                                                        .offset(vo.getPageNumber() - 1);
                                                                                            
result = queryBase.fetch();
728x90
반응형

타겟 넘버와 같은 경우 주어진 숫자에 +,- 두 연산을 통해서 원하는 숫자의 값이 나오는지 찾는 문제 이다. 

여기서 핵심은 역시나 +, - 조합을 통해서 원하는 계산 결과가 나오는 것인다. 

+, -의 조합은 결국 조합할 수 있는 모든 경우의 수를 접근 하는 것이다. 

여기서 핵심은 조합을 통한 경우의 수를 찾아야하는 경우 역시나 이전에 풀었던 소수 찾기와 마찬가지로 dfs를 이용하는 것이다. 

dfs는 트리 형태로 경우의 수를 찾아내는 방식이다. 

문제를 파악했을때 머리속에 트리 형태로 그림이 그려지도록 노력해야할 듯하다. 

package com.ji.study;

import static org.junit.Assert.assertEquals;

import org.junit.jupiter.api.Test;

public class TargetNumberTest {

	@Test
	void test() {

		TargetNumber test = new TargetNumber();
		
		assertEquals(5, test.solution(new int[] {1,1,1,1,1}, 3));
		assertEquals(3, test.solution(new int[] {2,3,5,7,9}, 2));
		assertEquals(1, test.solution(new int[] {1}, 1));
		assertEquals(5, test.solution(new int[] {6,2,3,6,7,1}, 7));

	}


}
package com.ji.study;

public class TargetNumber {
	
	
	public static void main(String[] args) {
		int[] numbers = { 1,1,1,1,1};
		int target = 3;

		solution(numbers, target);
		System.out.println("결과 : "+solution(numbers, target));
	}
	
	public static int solution(int[] numbers, int target) {
        int answer = 0;
        
        // DFS를 구성할때 numbers[0], -numbers[0]은 +식 -식을 넣는 경우의 간선을 의미함
        answer = dfs(numbers, target, numbers[0], 1) + dfs(numbers, target, -numbers[0], 1);
        
        return answer;
    }
    
    public static int dfs(int[] numbers, int target, int sum, int i) {
        
        if(i == numbers.length) {
            if(sum == target) {
                return 1;
            } else {
                return 0;
            }
        }
        
        int result = 0;
        //각 노드의 숫자들을 재귀적으로 더하거나 빼면서 계산함
        result += dfs(numbers, target, sum+numbers[i], i+1);
        result += dfs(numbers, target, sum-numbers[i], i+1);
        return result;
    }

}

[출처] lkhlkh23.tistory.com/74

 

[프로그래머스 알고리즘] 타켓넘버 - 깊이탐색 DFS

프로그래머스 2단계 타겟넘버 문제  url : https://programmers.co.kr/learn/courses/30/lessons/43165 문제설명 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다..

lkhlkh23.tistory.com

 

728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[프로그래머스] 프린터  (0) 2021.05.07
[백준] DFS와 BFS  (0) 2021.05.01
[프로그래머스] 주식 가격  (0) 2021.04.29
[프로그래머스] 다리를 지나는 트럭  (0) 2021.04.20
[프로그래머스] 소수 찾기  (0) 2021.04.20

+ Recent posts