*MySQL 버전, advanced select 문제입니다.
해커랭크 Type of Triangle 문제, 샘플, 설명
- TRIANGLES 테이블 레코드의 삼각형 타입을 구분하는 쿼리 작성하기.
- 세 변의 길이를 담은 테이블 TRIANGELS.
- Equilateral: 정삼각형, 세 변 길이 모두 같음
- Isosceles: 이등변삼각형, 두 변 길이 같음
- Scalene: 삼각형, 세 변 길이 모두 다름
- Not A Triangle: 삼각형 아님
대충 A, B, C가 각 변의 길이 데이터를 담고 있음을 보이며, 삼각형 종류를 설명하고 있다.
이때 (13, 14, 30)은 변 A, B의 합이 변 C보다 작아서 삼각형이 아니다.
해커랭크 Type of Triangle 답
- CASE WHEN, 비교 연산자 사용
조건별로 구분할 것이 여럿이기 때문.
SELECT CASE
WHEN A=B AND B=C THEN 'Equilateral'
WHEN A+B <= C OR A+C <= B OR B+C <= A THEN 'Not A Triangle'
WHEN A=B OR A=C OR B=C THEN 'Isosceles'
ELSE 'Scalene'
END
FROM TRIANGLES;
추가 정리
- CASE WHEN 조건식 입력 순서 유의
CASE WHEN은 조건식 입력 순서대로 T/F를 판단한다.
CASE WHEN 조건식 1에서 먼저 T/F를 판단 후, 그중 F인 데이터를 대상으로 두 번째 WHEN 조건식 2에서 다시 T/F를 판단한다. 그러므로 각 조건식들의 순서를 고려할 때, '조건들이 충돌하는가?'를 확인해야 한다.
해당 문제도 이 점을 유의해야 한다.
아래처럼 Not A Triangle을 세 번째 조건식으로 작성하면, Isosceles와 충돌하기에 오답이다.
SELECT CASE
WHEN A=B AND B=C THEN 'Equilateral'
WHEN A=B OR A=C OR B=C THEN 'Isosceles'
WHEN A+B <= C OR A+C <= B OR B+C <= A THEN 'Not A Triangle'
ELSE 'Scalene'
END
FROM TRIANGLES;
먼저 두 변이 같은 값들만 Isosceles로 판단하고 이 외 값들은 다음 조건식으로 넘어가서 판단된다.
즉 A != B, A!=C, B!=C 같은 데이터를 대상으로 Not A Triangle인지 판단한다.
하지만 여기서 충돌이 발생한다.
A+B <= C를 예로 들면, A!=B 뿐만 아니라 A=B도 A+B <= C일 수 있기에 부정확한 분류가 될 수 있다.
다시 말해 Isosceles의 조건식보다 Not A Triangle의 조건식이 더 포괄적이다.
그래서 Not A Triangle의 조건식보다 Isosceles의 조건식을 먼저 쓰면 오답이다.
작성하기 쉬운 순서대로 입력하다가 오답 처리되었는데..CASE WHEN을 막 입력하면 무서운 결과가 발생할 수 있음을 다시 깨닫게 한 문제이다.
'SQL > HackerRank(해커랭크)' 카테고리의 다른 글
HackerRank(해커랭크) MySQL Occupations 문제 답 (0) | 2023.10.16 |
---|---|
HackerRank(해커랭크) MySQL The PADS 문제 답 (0) | 2023.10.13 |
HackerRank(해커랭크) MySQL Weather Observation Station 20 문제 답 (1) | 2023.10.09 |
HackerRank(해커랭크) MySQL Weather Observation Station 19 문제 답 (2) | 2023.10.06 |
HackerRank(해커랭크) MySQL Average Population of Each Continent 문제 답 (0) | 2023.10.05 |