문제
REST_INFO 테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름,
즐겨찾기수를 조회하는 SQL문을 작성해주세요.이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
나의 답
SELECT ri.FOOD_TYPE,ri.REST_ID,ri.REST_NAME,ri.FAVORITES
FROM (select food_type, max(favorites) as max -- 음식 종류별 가장 높은 좋아요 수
from REST_INFO
group by food_type) sub
inner join rest_info ri
on sub.food_type = ri.food_type -- 음식 종류 매칭
and sub.max = ri.favorites -- subquery에서 찾은 가장 높은 좋아요 매칭
GROUP BY ri.FOOD_TYPE
ORDER BY ri.FOOD_TYPE DESC
지금껏 문제들 중에서 join을 하기 위해서 두 개의 컬럼을 on시키는 것을 처음봐서 한참 고민하였다가 다른 사람의 풀이를 보고 이런 방법도 있음을 알았다.
나의 답
class Solution {
public int solution(int n) {
String Ternary = "";
while (n > 0) {
Ternary += n % 3; //3진법 아래자릿수부터 넣기
n /= 3;
}
return Integer.parseInt(Ternary,3);
}
}
String을 활용하여서 시간이 많이 걸렸다
문자열로 전환 과정에서 시간이 많이 사용되는 것 같다. 승범님이 한 방법을 따라 리스트에 담는 방식으로도 진행해보았다.
import java.util.*;
class Solution {
public int solution(int n) {
int answer = 0;
ArrayList<Integer> toTernary = new ArrayList<Integer>();
while (n > 0) {
toTernary.add(n % 3);
n /= 3;
}
int digit = 1;
for (int i = toTernary.size() - 1; i >= 0; i--) {
answer += toTernary.get(i) * digit;
digit *= 3;
}
return answer;
}
}
시간이 거의 300분의 1로 획기적으로 단축된 것을 확인할 수 있다. 로직에서 반드시 필요한 부분이 아니라면 문자열은 사용하지 않는 것이 맞는 것 같다.
소수 찾기
나의 답
class Solution {
public int solution(int n) {
int countAll = 0;
for (int i = 2; i <= n; i++) {
int j = 2;
boolean count = true;
while (j <= (int)Math.sqrt(i)) {
if (i % j == 0) {
count = false;
break;
}
j++;
}
if (count) {
countAll++;
}
}
return countAll;
}
}
SQL 강의 듣기 (SQL 실시간 강의 + 엑셀보다 쉬운 SQL)
https://teamsparta.notion.site/5-6ca7d5a20f424aefaaf5ba74a7074131