2024_09_03 Kata

SJ.CHO·2024년 9월 3일

알고리즘 Kata

60

답안 :

import java.util.Arrays;

public class Solution {

	public int solution(int number, int limit, int power) {
		int answer = 0;
		int Factors[] = new int[number];
		int Factorscnt = 0;
		boolean limitflag[] = new boolean[number];
		Arrays.fill(limitflag, true);
		for (int i = 1; i <= Factors.length; i++) {
			for (int j = 1; j * j <= i; j++) {
				if (j * j == i) {
					Factorscnt++;
				} else if (i % j == 0) {
					Factorscnt += 2;
				}
			}
			Factors[i - 1] = Factorscnt;
			Factorscnt = 0;
			if (Factors[i - 1] > limit) {
				limitflag[i - 1] = false;
			}
			if (limitflag[i - 1]) {
				answer += Factors[i - 1];
			} else {
				answer += power;
			}
		}

		return answer;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution s = new Solution();
		int number = 5;
		int limit = 3;
		int power = 2;
		System.out.println(s.solution(number, limit, power));
	}
}
  • 알고리즘 설명 : 주워진 number의 약수갯수를 구하여 배열에 삽입후 bool 배열 idx와 맞추어 limit 초과값인지 아닌지 검사후 조건에 맞추어 합산.
int count = 0;
for (int i = 1; i <= N; i++) {
	if (N % i == 0) count++;
}
  • 처음 약수부분을 반복문을 사용하여 O(n)으로 알고리즘을 풀었으나 시간초과. 케이스중 방대한양이 있다고 판단.
int count = 0;
for (int i = 1; i * i <= N; i++) {
	if (i * i == N) count++;
	else if (N % i == 0) count += 2;
}
  • 약수부분을 최적화하여 O(√n)으로 단축. 성공하였음.

참조 : https://chwan.tistory.com/entry/Java-%EC%95%BD%EC%88%98%EC%9D%98-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0

SQL Kata

60

답안 :

SELECT Year(o1.SALES_DATE) as 'YEAR', 
month(o1.SALES_DATE) as 'MONTH' , 
u1.GENDER, count(Distinct u1.USER_ID) as 'USERS'
from USER_INFO u1
left join ONLINE_SALE o1
on u1.USER_ID = o1.USER_ID
where u1.GENDER is not null AND Year(o1.SALES_DATE) is not null AND month(o1.SALES_DATE) is not null
group by 1,2,3
order by 1,2,3
  • 문제가 어렵기보단 문제지문을 제대로 못읽어서 오래걸린문제. USER_ID의 중복구매와 문자열 정렬기준을 정립한다면 풀 수 있다.
SELECT Year(o1.SALES_DATE) as 'YEAR', 
month(o1.SALES_DATE) as 'MONTH' , 
u1.GENDER, count(Distinct u1.USER_ID) as 'USERS'
from USER_INFO u1
Inner join ONLINE_SALE o1
on u1.USER_ID = o1.USER_ID
where u1.GENDER is not null
group by 1,2,3
order by 1,2,3
  • inner join을 사용한다면 where절의 조건을 줄일수있다. 이게 조금더 정답에 가깝다 봄.

61

답안 :

SELECT r1.REST_ID , r1.REST_NAME,r1.FOOD_TYPE ,r1.FAVORITES, r1.ADDRESS,ROUND(avg(r2.REVIEW_SCORE),2) as 'SCORE'
from REST_INFO r1
inner join  REST_REVIEW r2
on r1.REST_ID=r2.REST_ID
where substr(r1.ADDRESS,1,2) ='서울'
group by 1
order by 6 desc,4 desc
  • 최대값이나 group by의 조건이 필요하지 않기에 where 절의 조건을 통해 원하는 문자열과 집계함수만 잘 사용한다면 쉽게풀수있음.
profile
70살까지 개발하고싶은 개발자

0개의 댓글