2024_09_20 Kata

SJ.CHO·2024년 9월 20일

알고리즘 Kata

69.

답안 :

import java.util.HashMap;
import java.util.Map;

public class Solution {
	public String solution(String[] survey, int[] choices) {
		StringBuffer sb = new StringBuffer();
		char c = ' ';
		Map<Character, Integer> map = new HashMap<>();
		map.put('R', 0);
		map.put('T', 0);
		map.put('C', 0);
		map.put('F', 0);
		map.put('J', 0);
		map.put('M', 0);
		map.put('A', 0);
		map.put('N', 0);
		for (int i = 0; i < survey.length; i++) {
			int score = choices[i] - 4;
			if (score < 0) {
				score *= -1;
				c = survey[i].charAt(0);
				if (map.containsKey(c)) {
					map.put(c, map.get(c) + score);
				} else {
					map.put(c, score);
				}
			} else {
				c = survey[i].charAt(1);
				if (map.containsKey(c)) {
					map.put(c, map.get(c) + score);
				} else {
					map.put(c, score);
				}
			}
		}
		if (map.get('R') >= map.get('T')) {
			sb.append('R');
		} else {
			sb.append('T');
		}
		if (map.get('C') >= map.get('F')) {
			sb.append('C');
		} else {
			sb.append('F');
		}
		if (map.get('J') >= map.get('M')) {
			sb.append('J');
		} else {
			sb.append('M');
		}
		if (map.get('A') >= map.get('N')) {
			sb.append('A');
		} else {
			sb.append('N');
		}
		String answer = sb.toString();
		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		String[] survey = { "TR", "RT", "TR" };
		int[] choices = { 7, 1, 3};
		System.out.println(s.solution(survey, choices));
	}
}
  • 알고리즘 설명 : HashMap 을 이용해 각 유형별 점수를 저장. 초이스의 점수에 따라 음수일 경우 앞성향 양수일경우 뒷성향으로 분간하여 해당 점수를 맞는 성향의 점수에 더한다. 이후 저장된 성향점수를 가지고 성향을 결정, 반환한다.
    원소가 정해져있고 길이가 1000 이하이기때문에 작동방식의 문제도 크지않은편.

SQL Kata

74.

답안 :

SELECT 
    C.CAR_ID, 
    C.CAR_TYPE, 
    FLOOR(C.DAILY_FEE * 30 * (1 - DP.DISCOUNT_RATE / 100)) AS FEE
FROM 
    CAR_RENTAL_COMPANY_CAR C
LEFT JOIN 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY RH 
    ON C.CAR_ID = RH.CAR_ID 
    AND RH.START_DATE <= '2022-11-30' 
    AND RH.END_DATE >= '2022-11-01'
JOIN 
    CAR_RENTAL_COMPANY_DISCOUNT_PLAN DP 
    ON C.CAR_TYPE = DP.CAR_TYPE 
    AND DP.DURATION_TYPE = '30일 이상'
WHERE 
    C.CAR_TYPE IN ('세단', 'SUV')
    AND RH.HISTORY_ID IS NULL  -- 2022년 11월 1일~30일 사이에 대여 이력이 없는 자동차만 선택
HAVING 
    FEE >= 500000 AND FEE < 2000000
ORDER BY 
    FEE DESC, 
    C.CAR_TYPE ASC, 
    C.CAR_ID DESC;
  • 3중join 을 이용하여 join하며 데이터를 미리 걸러서 묶어주는 방법. 오히려 NULL을 이용하여 대여이력이 없는경우를 검사하였다.

틀린답안 :

select CAR_ID,CAR_TYPE,case when CAR_TYPE='세단' then Round(FEE-(FEE*0.1),0)
else Round(FEE-(FEE*0.08),0) end as 'FEE'
from
(SELECT c1.CAR_ID,c1.CAR_TYPE,if(DAILY_FEE*30 between 500000 AND 2000000,DAILY_FEE*30,null) as 'FEE',date_format(c2.END_DATE,'%Y-%m') as 'END_DATE'
from CAR_RENTAL_COMPANY_CAR c1
inner join CAR_RENTAL_COMPANY_RENTAL_HISTORY c2
on c1.CAR_ID = c2.CAR_ID
where c1.CAR_TYPE = '세단' OR c1.CAR_TYPE ='SUV') a
where END_DATE not in ('2022-11') and FEE is not null
group by CAR_ID
order by FEE desc, CAR_TYPE, CAR_ID desc
  • 서브쿼리를 이용하여 11월의 대여이력이 존재하지않으면서 50만~200만의 타입을 찾으려했지만 실패.
profile
70살까지 개발하고싶은 개발자

0개의 댓글