SQL 해커랭크 | Type of Triangle (삼각형의 조건, CASE WHEN문, NOT과 IN연산자)

    728x90

    문제

    https://www.hackerrank.com/challenges/what-type-of-triangle/problem?isFullScreen=true

     

    Type of Triangle | HackerRank

    Query a triangle's type based on its side lengths.

    www.hackerrank.com

     

    • Equilateral : It's a triangle with 3 sides of equal length.
    • Isosceles : It's a triangle with 2 sides of equal length.
    • Scalene : It's a triangle with 3 sides of differing length.
    • Not a Triangle : The given values of A, B and C don't form a triangle.

     

    문제해석

    • Equilateral : 세 변의 길이가 같을 때 → 정삼각형
    • Isosceles : 두 변의 길이가 같을 때 (나머지 한 변의 길이만 다름) → 이등변 삼각형
    • Scalene : 세 변의 길이가 모두 다를 때 → 그냥 삼각형
    • Not a Triangle : 두 변의 길이 합이 제일 긴 한 변의 길이보다 '같거나 작으면' 삼각형이 아님
      • ex) a = 13, b = 14, c = 30
      • 13 + 14 < 30
      • 따라서, 삼각형이 아님
      • 세 변의 길이가 같지 않은 이상, 두 변의 길이 합은 제일 긴 변의 길이보다 커야함

     

    테이블

    TRIANGLES

     

    풀이과정

    1
    2
    3
    4
    5
    6
    7
    SELECT CASE
           WHEN A+B<=C OR B+C<=A OR C+A<=B THEN 'Not A Triangle'
           WHEN A=B AND B=C AND C=A THEN 'Equilateral'
           WHEN A<>B AND B<>C AND C<>A THEN 'Scalene'
           ELSE 'Isosceles'
           END
    FROM TRIANGLES
    cs

     

    (1) CASE문 실행 순서에 따라

    가장 첫 번째 WHEN문에는 가장 포괄적인 조건을 주고, 점차 지엽적인 조건을 써줘야 함

    먼저 삼각형인지 아닌지를 분류할 수 있는 삼각형 판변 조건을 적어줌 

     

    (2) 'Not a Triangle' 조건문에 OR 를 사용해 A, B, C 세 변 사이의 관계 케이스를 넣어줌 

    • A + B가 C보다 작거나 같거나
    • B + C가 A보다 작거나 같거나
    • C + A가 B보가 작거나 같으면 → 삼각형이 아니다.

     

    + 다른 풀이 

    1
    2
    3
    4
    5
    SELECT (CASE 
            WHEN NOT(A + B > C AND B + C > A AND C + A > B) THEN "Not A Triangle"
            WHEN A = B and B = C THEN "Equilateral"
            WHEN A = B or B = C or C = A THEN "Isosceles"
    ELSE "Scalene" END) FROM Triangles;
    cs

     

    삼각형 판별 조건에 NOT( 조건1 AND 조건2 AND 조건3) 을 사용함

    • A + B가 C보다 크고,
    • B + C가 A보다 크고,
    • C + A가 B보다 큰 경우가 아닐 때(NOT) → 삼각형이 아니다.
      • NOT 연산자는 조건이 FALSE인 경우 출력함
      • 조건1, 조건2, 조건3 을 차례대로 실행했을 때 만족하지 않은 조건이 있으면 출력함
        • ex) A = 30, B = 13, C = 14
        • 조건1인 A + B > C 는 True 였으나 조건2인 B + C > A가 FALSE로 판명되면
          AND 연산자로 이어져있기 때문에 전체는 FALSE가 됨  → 'Not A Triangle'이 출력

     

    + 다른 풀이 

    1
    2
    3
    4
    5
    SELECT
    IF(A+B+<= 2*GREATEST(A,B,C),"Not A Triangle",
    IF(A=B and B=C,"Equilateral",
    IF(A=B or B=C or C=A,"Isosceles","Scalene")))
    FROM Triangles;
    cs

     

    수학적 지식을 사용함

    • 삼각형이 아니면, 세 변을 모두 더한 값 <=  (2 * 세 변 중 가장 긴 길이)
    • 정삼각형의 경우, A=B 이고 B=C이면 C=A이므로 앞의 두 조건만 적어준 것 굿~
    • 이등변 삼각형의 조건을 충족하지 않으면 그냥 삼각형인 것

     

    배운점

    ▶ CASE문

    • SELECT 뒤에 컬럼명 없이 바로 CASE문을 써도 된다는 것
    • CASE 뒤에 컬럼명 없이 바로 WHEN 써도 된다는 것
    • CASE WHEN 조건이 처음부터 차례대로 실행되기 때문에 첫 조건은 포괄적인 것부터 적어줘야 된다는 것
    • A=B=C 이렇게 적으면 에러남. A=B AND B=C AND C=A 이렇게 따로 적어줘야 된다는 것

    https://jaehwaseo.tistory.com/10

     

    [MySQL] CASE 문 : 조건에 따라 값 정하기 (CASE WHEN THEN END)

    CASE WHEN THEN ELSE END SQL 문제를 풀다 보면 CASE에 따라 조건을 나눠서 출력하라는 것을 종종 볼 수 있다. 그럴 경우 사용해주면 유용하다. 우선 기본적인 형태부터 보고 가자. SELECT CASE WHEN(조건A) THEN

    jaehwaseo.tistory.com

     

    ▶ NOT 연산자 (+@ IN연산자)

    • WHEN (A+B < C) AND (B+C < A) AND (C+A < B) THEN 'Not A Triangle' 이렇게 적으면 에러남
      • 세 조건 모두를 만족하는 경우에만 Not A Triangle을 출력하기 때문
      • 이럴 때는 하나라도 FALSE면 Not A Triangle이 출력되도록 NOT 연산자 써주기 
    • (참고) IN 연산자를 사용하면 OR의 효과가 있음
      • ex) (Fruit = 'banana') OR (Fruit = 'strawberry') 이렇게 쓰는 것과
      • Fruit IN( ('banana', 'strawberry') 이렇게 쓰는 게 같은 결과물을 출력함

    https://www.joinc.co.kr/w/mysql_AND_OR_NOT

     

    MySQL AND, OR, NOT 연산자

    MySQL의 SELECT statement는 몇 개의 절을 포함하고 있다. 그 중에서 WHERE 절(Clause)은 특정 조건으로 레코드를 필터링할 때 사용한다. 이때 한 가지 이상의 조건을 조합해서 사용 해야 하는 경우가 있는

    www.joinc.co.kr

    728x90

    댓글