Q. 다음과 같은 TRIANGLES 테이블이 있다고 하자.
각 컬럼인 A, B, C는 한 삼각형의 세 변의 길이를 의미한다.
이 정보를 활용하여 해당 삼각형이 어떤 종류의 삼각형인지를 구분하여라. (문제 바로가기)
삼각형의 타입은 다음과 같은 조건으로 나눈다.
- 삼각형의 세 변의 길이가 모두 동일한 경우: Equilateral
- 삼각형의 세 변 중 두 변의 길이가 동일한 경우: Isosceles
- 삼각형의 세 변의 길이가 모두 다른 경우: Scalene
- ★ 다만 가장 긴 변이 나머지 두 변의 합보다 작다면 그건 삼각형이라고 할 수 없다.
(예를 들어 C가 가장 긴 변인데, A와 B의 합이 C보다 작으면 Not A Triangle)
예를 들어 TRIANGLES 테이블의 값이 다음과 같다고 하자.
- 첫 행은 Isosceles 이다. 그 이유는 세 변 중에 두 변의 길이만 같으므로.
- 두번째 행은 Equilateral 이다. 세 변의 길이가 모두 같으므로.
- 세번째 행은 Scalene 이다. 세변의 길이가 모두 다르기 때문.
- 마지막 행은 삼각형이라고 할 수 없다. 그 이유는 가장 긴 변인 30이 나머지 둘의 합 13+14=27보다도 작기 때문이다.
그래서 결과는 다음과 같이 나와야 한다.
Isosceles
Equilateral
Scalene
Not A Triangle
SQL 쿼리 답안
우선 결과물로는 삼각형의 타입이 나와야 하므로 CASE WHEN 구문을 써야 한다는 것을 바로 알았을 것이다.
(참고로 CASE WHEN 구문이 무엇인지 모르겠다면 이 포스팅에 아주 자세히 설명했으므로 참고하면 좋다!)
다만 여기서는 연산자를 사용한 조건문을 쓰는 부분이 좀 까다롭기 때문에 따로 포스팅 하였다.
처음에는 곧바로 A, B, C의 변이 같으냐 다르냐로 조건문을 썼는데,
이 문제의 핵심은 "각 행이 삼각형이 되는가?" 부터 검사해야 한다.
앞에서 가장 긴 변이 나머지 두 변의 합보다 작다면 삼각형이 되지 않는다고 하였다.
그래서 CASE WHEN을 활용해 가장 긴 변이 나머지 두 변의 합보다 큰 것만 갈라내고, 그게 아니라면(ELSE) 삼각형이 아니라고 반환한다.
그리고 전자에 대해 세부적인 조건문을 쓴다.
내가 푼 답안은 다음과 같다.
SELECT CASE WHEN A+B>C AND A+C>B AND B+C>A THEN
CASE WHEN A=B AND B=C THEN 'Equilateral'
WHEN A<>B AND B<>C AND A<>C THEN 'Scalene'
ELSE 'Isosceles'
END
ELSE 'Not A Triangle' END
FROM TRIANGLES
- 가장 첫번째 문에서 두 변의 합이 나머지 변보다 더 큰 경우(삼각형인 경우)만 걸러낸다.
- 여기에서 중첩된 CASE WHEN 문을 사용해 A, B, C 세 변이 모두 같으면 Equilateral
- A, B, C 세 변이 모두 다르면 Scalene
- 나머지(ELSE)는 Isosceles
- 가장 첫번째 문에서 걸러지지 않았다면(ELSE) 삼각형이 아니므로 Not A Triangle
여기서 주의할 점은 A, B, C 세 변이 모두 같다고 A=B=C라고 쓰면 안 된다.
또한 A, B, C 세변이 모두 다르다고 A<>B<>C라고 쓰면 안 된다는 점이다. (특히 이 케이스는 A와 B는 다르고, B와 C는 다른데 A와 C는 같을 수도 있으므로)
참고로 Isosceles를 조건에 넣고 ELSE를 Scalene로 넣는 식으로 쿼리를 짤 수도 있다.
SELECT CASE WHEN A+B>C AND A+C>B AND B+C>A THEN
CASE WHEN A=B AND B=C THEN 'Equilateral'
WHEN A=B OR B=C OR A=C THEN 'Isosceles'
ELSE 'Scalene'
END
ELSE 'Not A Triangle' END
FROM TRIANGLES
반응형
'Skillset > SQL' 카테고리의 다른 글
[MySQL] 문자열에서 0 제거하기 (REPLACE) (0) | 2022.08.12 |
---|---|
SQL로 깔끔한 문장 출력하기 (CONCAT 활용) (0) | 2022.08.10 |
SQL 특정 문자들로 시작 or 끝나는 도시 출력하기 (0) | 2022.08.08 |
[MySQL] 가장 짧은 글자와 가장 긴 글자에 해당하는 도시 구하기 (LENGTH) (0) | 2022.08.07 |
[MySQL] RECURSIVE 구문 활용해 배열 생성하기 예제 (feat. 빅쿼리 UNNEST) (0) | 2022.06.23 |