문제 내용 : Write a query identifying the type of each record in the TRIANGLES table using its three side lengths. Output one of the following statements for each record in the table:
Equilateral: It's a triangle with sides of equal length.
Isosceles: It's a triangle with sides of equal length.
Scalene: It's a triangle with sides of differing lengths.
Not A Triangle: The given values of A, B, and C don't form a triangle
해석 :
A,B,C 세 변의 길이가 주어진 3개의 변수를 사용하여 TRIANGLES 테이블의 각 레코드 유형을 식별하는 쿼리를 작성하세요. 테이블의 각 레코드에 대해 다음 명령문 중 하나를 출력합니다.
정삼각형 : 변의 길이가 같은 삼각형입니다.
이등변삼각형: 변의 길이가 같은 삼각형입니다.
부등변삼각형: 변의 길이가 다른 삼각형입니다.
삼각형이 아님: 주어진 A, B, C 값이 삼각형을 형성하지 않습니다.
풀이 매크로
1. 각 도형별 조건문
1)정삼각형 : A=B 그리고 B=C
2)이등변삼각형 : A=B 또는 B=C 또는 A=C
3)부등변삼각형 : A!=B 또는 A!=C 또는 C!=B
4)삼각형이 아님 : A+B <= C 또는 A+C <= B 또는 B+C <= A
2. 조건들간의 포함조건 고려 :
- '4)삼각형이 아님' 조건이 다른 조건들을 포함할 수 있음.
- '1)정삼각형' 조건이 '2)이등변삼각형' 조건들을 포함할 수 있음.
3. 따라서 CASE문 작성순서는 4) > 1) > 2) > 3) 으로 작성함. 이는 조건범위가 좁은것부터 넓은 순으로 적어주고 데이터를 확인하면서 조건이 잘 맞는지 확인하는 방법만 있는 것 같다..
SELECT CASE
WHEN ((A+B <= C) OR (B+C <= A) OR (A+C <= B)) THEN 'Not A Triangle'
WHEN ((A=B) AND (A=C) AND (B=C)) THEN 'Equilateral'
WHEN (A=B OR B=C OR A=C) THEN 'Isosceles'
WHEN ((A!=B) AND (A!=C) AND (B!=C)) THEN 'Scalene'
END
FROM TRIANGLES
잘못된 풀이과정
풀이 매크로 2)의 조건포괄을 고려하지 않으면 CASE문이 실행된 테이블 행에 대해서는 다음 CASE 조건문에 해당되더라도 CASE 아웃풋이 수정되지 않는다. CASE 문 생성할 때 중복된 변수들을 이용할 경우 이점을 유의해아한다.
문제 출처 : https://www.hackerrank.com/challenges/what-type-of-triangle/problem
'SQL > 코딩테스트' 카테고리의 다른 글
[MySQL] Self join을 활용한 코딩테스트 주의사항 (0) | 2024.11.05 |
---|---|
[MySQL] Self Join (0) | 2024.11.05 |
[MySQL] 그룹변수가 2개로 피벗테이블 구성 (0) | 2024.11.05 |
[MySQL] SQL로 피벗테이블 만드는 순서(데이터 피봇팅) (0) | 2024.11.05 |
[MySQL] 그룹화된 변수에 조건을 걸어 원하는 값 출력하기 (0) | 2024.11.04 |