https://www.hackerrank.com/challenges/what-type-of-triangle/problem?isFullScreen=false
위와 같이 삼각형의 각 변 A,B,C 와 각 변의 길이가 컬럼으로 존재하는 테이블이 있다.
결과는 Isosceles , Equilateral ,Scalene ,Not A Triangle 넷중 하나가 된다. 해당 단어가 뜻하는 바는 아래와 같다.
1) Not A Triangle : 세 변중 가장 긴 변의 길이가 나머지 두변의 합보다 크거나 같은 경우
2) Equilateral : 1) 의 조건을 만족하고 세변의 길이 모두가 같은 경우
3) Scalene : 1) 의 조건을 만족하고 세변의 길이가 모두 다른 경우
4) Isosceles : 1) 을 만족하고 2),3),4) 를 만족하지 않는 경우
특정 경우에 다른 단어를 출력해주는 것이므로 쿼리 내에서는 CASE WHEN 문을 사용할 것이다.
이 문제에서 조심해야할 부분은 CASW WHEN 문은 처음 조건부터 순차적으로 검사하는 방식이므로
첫번째 필터링에서 공통으로 소유하는 특징을 기준으로 잡아줘야 한다.
일단 위 벤 다이어그램을 봐주면 Isosceles , Equilateral ,Scalene 세가지는 삼각형(TRIANGLE) 에 포함되는걸 알 수있고,
해당 영역에 포함되지 않으면 NOT A TRIANGLE이 됨을 알 수 있다.
즉 Isosceles , Equilateral ,Scalene 를 만족하기 위해서는 일단 NOT A TRIANGLE 이 아니면 된다는 뜻이되고
선행적으로 CASE WHEN 문에서 TRIANGLE이 맞는지 아닌지 판단해줘야 한다는 뜻이 된다.
만약 해당 조건을 쓰지 않고 순서를 바꿔버린다면 아래와 같이 오답이 나오게 된다.
SELECT
A
, B
, C
, CASE
WHEN A = B AND B = C THEN 'Equilateral'
WHEN A <> B AND B <> C AND A <> C THEN 'Scalene'
WHEN A + B <= C OR A + C <= B OR B + C <= A THEN 'Not A Triangle'
ELSE 'Isosceles'
END
FROM TRIANGLES
각 변의 길이가 20 12 61 그리고 20 22 50 이 Scalene 으로 표시되어 있다.
세변의 길이가 다 달라 보이니까 언뜻 맞아보인다 하지만, 해당 변이 주어졌을 떄의 답은 NOT A TRIANGLE 이 나와줘야 한다. 가장 큰 변의 길이가 나머지 두변을 더한 길이 이상이기 때문이다.
이러한 답이 나오는 경우는 if 문과 다르게 CASE WHEN 문은 순차적으로 비교해주고
비교값이 TRUE 가 나오면 비교를 멈춰주고 값을 리턴하기 때문이다.
즉 20 22 50, 20 12 61 와 같은 케이스에서는 2번째 CASE 문에 걸리고 해당 CASE 문에서 TRUE 를 반환했기 때문에
오답을 도출하는 것이다.
즉, CASE 문의 성질을 제대로 이해하고 있다면 아래와 같이 정답을 유도할 수 있다.
SELECT
CASE WHEN A + B <= C OR A + C <= B OR B + C <= A THEN 'Not A Triangle'
WHEN A = B AND B = C THEN 'Equilateral'
WHEN A <> B AND B <> C AND A <> C THEN 'Scalene'
ELSE 'Isosceles'
END
FROM TRIANGLES
'코딩 테스트' 카테고리의 다른 글
백준 14503번 - 로봇 청소기 (0) | 2022.01.18 |
---|---|
백준 14502번 - 연구소 (0) | 2022.01.04 |
백준 4963번 - 섬의개수 (0) | 2021.12.24 |
HackerRank The PADS(SQL) (0) | 2021.12.22 |
백준 2178번 - 미로탐색 (2) | 2021.12.21 |