오늘은 알고리즘, SQL을 풀고 강의를 들었다.
알고리즘 문제는 다음과 같다.
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
phone_number는 길이 4 이상, 20이하인 문자열입니다.
풀이는 간단하다.
phone_number.length()를 돌려 -4까지는 answer에 "*"를 더하고, 그 이후에는 원래 숫자를 더하여 return하면 된다.
제출한 코드는 아래와 같다.
class Solution {
public String solution(String phone_number) {
String answer = "";
for (int i = 0; i < phone_number.length() - 4; i++){
answer += "*";
}
for (int j = phone_number.length() - 4; j < phone_number.length(); j++) {
answer += phone_number.charAt(j);
}
return answer;
}
}
SQL문제는 2개 풀었다.
첫 문제는 아래와 같다.
APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요.
이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.
SELECT문에 AS를 통해 컬럼명을 지정해주고, WHERE절에 LIKE '2022-05%'로 2022년 5월에 예약한 절을 추려낼 수 있다.
각 그룹 당 예약한 환자 수를 기준으로 하므로 집계함수 COUNT를 사용해야 한다. 따라서 GROUP BY MCDP_CD로 묶어주어야 한다.
ORDER BY로 정렬해주면 된다.
코드는 아래와 같다.
SELECT MCDP_CD AS "진료과 코드", COUNT(*) AS "5월예약건수"
FROM APPOINTMENT
WHERE APNT_YMD LIKE '2022-05%'
GROUP BY MCDP_CD
ORDER BY COUNT(*), MCDP_CD
다음 문제는 아래와 같다.
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드, 나이, 전화번호를 조회하는 SQL문을 작성해주세요.
이때 전화번호가 없는 경우, 'NONE'으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.
COALESCE 함수는 병합한다는 의미의 coalesce 함수입니다. 조건에 따라서 두 칼럼을 합치는 기능을 하는데, 이런 기능을 활용해서 NULL 값을 특정 값으로 변환하는 데 사용하기도 합니다.
SELECT A, B, COALESCE(A, B) FROM test;
함수는 두 개의 인자를 받습니다. 그리고 첫번째 인자의 0번째 행부터 value를 살핍니다. 만약 A 컬럼의 0번째 행이 NULL이라면 해당 값은 같은 줄에 있는 B 컬럼의 값으로 대체됩니다.
반대로, B 컬럼의 0번째 행이 NULL이라면 해당 값은 같은 줄에 있는 A 컬럼으로 대체됩니다. 두 값 모두 NULL이라면, NULL이 반환되고, NOT NULL이라면 A 값이 반환됩니다.
SELECT COALESCE(A, '---') FROM test;
이렇게 사용하면 A 컬럼의 NULL 값을 '---'로 대체할 수 있습니다. 컬럼을 병합하지 않고 하나의 컬럼 안에 있는 결측치를 다른 값으로 바꾸고 싶을 때 사용할 수 있습니다.
여러 칼럼이나 표현식을 순서대로 평가하면서, 가장 처음 만나는 NULL이 아닌 값을 결과로 돌려준다.
예를 들어, CLALESCE(TLNO, 'NONE') 표현식에서 'TLNO' 칼럼이 NULL인 경우 'NONE' 문자열을 반환하고, 그렇지 않으면 'TLNO' 컬럼의 값을 반환한다.
NULL 값을 다른 값으로 대체할 때, 여러 칼럼중에서 첫번째로 NULL이 아닌 값을 선택할 때 사용합니다.
코드는 아래와 같다.
SELECT PT_NAME, PT_NO, GEND_CD, AGE, COALESCE(TLNO, 'NONE') AS TLNO
FROM PATIENT
WHERE AGE <= 12 AND GEND_CD = 'W'
ORDER BY AGE DESC, PT_NAME ASC;