SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY;
이번 문제는 컬럼에서 특정 문자열을 추출하고 이를 집계하는 문제였다.
[1] 상품 카테코리 코드(PRODUCT_CODE, 2)별 상품 개수를 출력한다.
아래 실행 예시를 보면 CATEGORY
, PRODUCTS
을 확인할 수 있다. -> 문제에서 해당 두개의 컬럼을 사용하라는 의미다.
‘PRODUCT_CODE’ 컬럼에서 앞 2글자가 CATEGORY
를 의미하고, 카테고리별로 해당하는 숫자를 구하면 되는 문제인 것이다.
결과 : SELECT LEFT(PRODUCT_CODE, 2) AS CATEGORY, COUNT(PRODUCT_ID) AS PRODUCTS
[2] PRODUCT 테이블에서 가져오는 것이므로 -> 결과 : FROM PRODUCT
[3] 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요. -> 실행 예시에서는 CATEGORY
를 기준으로 오름차순 했으므로 해당 키워드를 사용하라는 의미다.
유형별로 갯수를 알고 싶을 때 컬럼에 데이터를 그룹화 할 수 있는 GROUP BY
를 사용한다. (특정 컬럼을 그룹화)
결과 : GROUP BY CATEGORY
: 기본적으로 오름차순으로 정렬한다.
메모리: 67.2 MB, 시간: 8.99 ms - Answer Code1(2022.02.20)
메모리: 72.9 MB, 시간: 0.09 ms - Answer Code2(2022.02.23)
import java.util.*;
class Solution {
public int solution(int n, int k) {
int answer = 0;
String temp = "";
//N진법 변환
while(n != 0) {
temp = n % k + temp;
n /= k;
}
String [] arr = temp.split("0");
for(String str : arr) {
if(str.equals("")) {
continue;
}
long num = Long.parseLong(str);
if(isPrime(num)) {
answer++;
}
}
return answer;
}
// 소수 확인 메서드
public boolean isPrime(long decimal) {
if(decimal < 2)
return false;
for(int i = 2; i <= Math.sqrt(decimal); i++) {
if(decimal % i == 0) {
return false;
}
}
return true;
}
}
소수 판별 알고리즘 문제였다.
처음에 문제에 대한 설명을 보고 도무지 이해가 안되어서 가만히 생각해봤는데, 0
을 기준으로 분해시켜서 개수를 구하면 되는 문제였다.
[1] N진법 로직으로 구현한다.
[2] N진법으로 푼 문자열을 0
을 기준으로 Split 한다.
주의 1) 1001 처럼 가운데 0이 있는 상태로 분해할 경우 1, “”, 1이 반환이 된다. 빈칸을 숫자로 변환하면 오류가 생기니 이런 경우를 제외해야 한다.
주의 2) 변환할 때 숫자를 Long 타입으로 바꿔야한다. 최대 100만이라는 숫자를 N진법으로 변환하면 엄청난 길의 숫자가 나열되고, int의 범위를 넘어서는 숫자가 생성되기 때문이다.
소수를 판별할 때는 에라토네스 체를 사용하는 걸 권장한다. 권장한 이유는 연산을 최대한 많이 줄이면서 소수인지 판별이 가능하기 때문이다.
class Solution {
public int solution(int n, int k) {
int ans = 0;
String temp[] = Integer.toString(n, k).split("0");
Loop : for(String t : temp) {
if(t.length() == 0) continue;
long a = Long.parseLong(t);
if(a == 1) continue;
for(int i=2; i<=Math.sqrt(a); i++)
if(a%i == 0) continue Loop;
ans++;
}
return ans;
}
}
두 번째 풀이는 좋아요 수가 많은 답안인데, 정말 깔끔한 풀이였다.
10진수 -> k진수로 변경은 String.valueOf(바꾸려는 숫자(10진수), 바꾸려는 k진법)
으로 간단하게 구현 가능하는 것을 구글링을 통해 알게 되었다.
Prime() 메서드를 단 세줄로 작성했다는 점에서 성능이 8배 가까이 개선되었다.
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
DATE_FORMAT(DATETIME, '%Y-%m-%d')
을 사용해야 한다.SELECT ANIMAL_ID, NAME,
IF((SEX_UPON_INTAKE LIKE "%Neutered%") OR (SEX_UPON_INTAKE LIKE "%Spayed%"), "O", "X") AS "중성화"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME,
CASE WHEN (SEX_UPON_INTAKE LIKE '%NEUTERED%' OR SEX_UPON_INTAKE LIKE '%SPAYED%') THEN 'O' ELSE 'X' END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = "Dog" AND NAME LIKE "%EL%"
ORDER BY NAME ASC
요약 : 동물 보호소에 들어온 동물 이름 중, 이름에 “EL”이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요.
이때 결과는 이름 순으로 조회해주세요.
단, 이름의 대소문자는 구분하지 않습니다.
특정 부분이 일치하는 데이터를 찾고싶을때는 LIKE를 이용는데, 주로 _
혹은 %
를 이용한다.
_
은 개수만큼 데이터가 있다는 의미로, __EL__
의 의미는 앞뒤에 데이터의 개수가 2개 있다는 의미이다.
%
은 글자수와 상관없이 데이터를 찾는 것을 의미하는데, %EL
은 끝자리인 EL 데이터를 찾는것이고, EL%
은 앞자리에 EL 데이터를 찾는다는 의미이다.
%EL%
은 앞뒤 상관없이 EL이 포함된 데이터를 찾는다는 것이다.