[SQL] 해커랭크(HackerRank) 문제풀이 2

jae.y·2022년 9월 25일
1

📝 문제

  • 문제는 HackerRank에 등록되어 있음
  • 모든 문제는 아래에 첨부한 STATION 테이블 사용
  • 데이터베이스로는 MySQL을 사용


테이블 명 : STATION

FieldType
IDNUMBER
CITYVARCHAR2(21)
STATEVARCHAR2(2)
LAT_NNUMBER
LONG_WNUMBER

where LAT_N is the northern latitude and LONG_W is the western longitude.


📍 1번 문제

Query a list of CITY and STATE from the STATION table.

: STATION 테이블의 CITY, STATE 열에 해당하는 데이터 출력
SELECT city, state
FROM station

   문제 1. Weather Observation Station 1


📍 2번 문제

Query a list of CITY names from STATION for cities that have an even ID number.
Print the results in any order, but exclude duplicates from the answer.

: ID 값이 짝수인 CITY name 데이터를 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE id LIKE '%0'
OR id LIKE '%2'
OR id LIKE '%4'
OR id LIKE '%6'
OR id LIKE '%8'

Short version

SELECT DISTINCT city
FROM station
WHERE id % 2 = 0 -- 짝수는 2로 나누면 나머지가 0임을 이용

   문제 2. Weather Observation Station 3


📍 3번 문제

Find the difference between the total number of CITY entries in the table and the number of distinct CITY entries in the table.

For example, if there are three records in the table with CITY values 'New York', 'New York', 'Bengalaru', there are 2 different city names: 'New York' and 'Bengalaru', The query returns 1, because total number of records - number of unique city names = 3 - 2 = 1

: CITY의 전체 데이터 개수와 중복 없이 유일한 값을 가지는 데이터 개수의 차이
SELECT COUNT(city) - COUNT(DISTINCT city)
FROM station

   문제 3. Weather Observation Station 4


📍 4번 문제

Query the list of CITY names starting with vowels (i.e., aeio, or u) from STATION. Your result cannot contain duplicates.

: 모음으로 시작되는 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE city LIKE 'a%'
   OR city LIKE 'e%'
   OR city LIKE 'i%'
   OR city LIKE 'o%'
   OR city LIKE 'u%'

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiou]' -- ^는 []안 문자열로 시작될 경우를 뜻 함

   문제 4. Weather Observation Station 6


📍 5번 문제

Query the list of CITY names ending with vowels (a, e, i, o, u) from STATION. Your result cannot contain duplicates.

: 모음으로 끝나는 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE city LIKE '%a'
   OR city LIKE '%e'
   OR city LIKE '%i'
   OR city LIKE '%o'
   OR city LIKE '%u'

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '[aeiou]$' -- $는 []안 문자열로 끝날 경우를 뜻 함

   문제 5. Weather Observation Station 7


📍 6번 문제

Query the list of CITY names from STATION which have vowels (i.e., aeio, and u) as both their first and last characters. Your result cannot contain duplicates.

: 첫 자와 끝 자가 모음인 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE (city LIKE 'a%'
    OR city LIKE 'e%'
    OR city LIKE 'i%'
    OR city LIKE 'o%'
    OR city LIKE 'u%')
    AND (city LIKE '%a'
    OR city LIKE '%e'
    OR city LIKE '%i'
    OR city LIKE '%o'
    OR city LIKE '%u')

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[aeiou]' AND city REGEXP '[aeiou]$'

   문제 6. Weather Observation Station 8


📍 7번 문제

Query the list of CITY names from STATION that do not start with vowels. Your result cannot contain duplicates.

: 모음으로 시작되지 않는 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE city NOT LIKE 'a%'
  AND city NOT LIKE 'e%'
  AND city NOT LIKE 'i%'
  AND city NOT LIKE 'o%'
  AND city NOT LIKE 'u%'

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[^aeiou]' -- []안의 ^는 일치하지 않음을 의미

   문제 7. Weather Observation Station 9


📍 8번 문제

Query the list of CITY names from STATION that do not end with vowels. Your result cannot contain duplicates.

: 모음으로 끝나지 않는 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE city NOT LIKE '%a'
  AND city NOT LIKE '%e'
  AND city NOT LIKE '%i'
  AND city NOT LIKE '%o'
  AND city NOT LIKE '%u'

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '[^aeiou]$'

   문제 8. Weather Observation Station 10


📍 9번 문제

Query the list of CITY names from STATION that either do not start with vowels or do not end with vowels. Your result cannot contain duplicates.

: 모음으로 시작되지 않거나 모음으로 끝나지 않는 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE (city NOT LIKE 'a%'
   AND city NOT LIKE 'e%'
   AND city NOT LIKE 'i%'
   AND city NOT LIKE 'o%'
   AND city NOT LIKE 'u%')
   OR (city NOT LIKE '%a'
   AND city NOT LIKE '%e'
   AND city NOT LIKE '%i'
   AND city NOT LIKE '%o'
   AND city NOT LIKE '%u')

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[^aeiou]' OR city REGEXP '[^aeiou]$'

   문제 9. Weather Observation Station 11


📍 10번 문제

Query the list of CITY names from STATION that do not start with vowels and do not end with vowels. Your result cannot contain duplicates.

: 모음으로 시작되지 않고 모음으로 끝나지 않는 CITY 명을 중복 제거하여 출력

Long version

SELECT DISTINCT city
FROM station
WHERE city NOT LIKE 'a%'
  AND city NOT LIKE 'e%'
  AND city NOT LIKE 'i%'
  AND city NOT LIKE 'o%'
  AND city NOT LIKE 'u%'
  AND city NOT LIKE '%a'
  AND city NOT LIKE '%e'
  AND city NOT LIKE '%i'
  AND city NOT LIKE '%o'
  AND city NOT LIKE '%u'

Short version - 정규 표현식(REGEXP)

SELECT DISTINCT city
FROM station
WHERE city REGEXP '^[^aeiou]' AND city REGEXP '[^aeiou]$'

   문제 10. Weather Observation Station 12


🧨 어려웠던 내용

7번 문제에서 ANDOR로 바꾸었을 때 오류가 발생해서 어려움이 있었다. 출력된 결과물을 보니 A로 시작되는 이름이 있었다.

my version

SELECT DISTINCT city
FROM station
WHERE city NOT LIKE 'a%'
  AND city NOT LIKE 'e%'
  AND city NOT LIKE 'i%'
  AND city NOT LIKE 'o%'
  AND city NOT LIKE 'u%'

잘 생각해보니, OR은 연결된 조건들 중 하나만 속해도 된다. 예를 들어, 'Arlington'은 e로 시작되는 단어가 아니니, 출력될 수 있다. 문제를 읽고 코드를 작성했을 때, 논리 연산(AND, OR)의 쓰임새를 정확히 알고 있어야겠다!!!! 이번 문제들을 풀면서 논리 연산에 대해 완벽하게 이해했다!!

👩🏻‍💻 보충한 내용

논리 연산(AND, OR)에 대한 이해력을 높이기 위해 여러 블로그를 참고하여 헷갈렸던 부분을 완벽하게 보충하였다!
NOT LIKE를 배우며, 이해를 높이는 과정에서 정규 표현식을 배웠다.

Metacharacter설명
^시작하는 문자열
$끝나는 문자열
[]임의의 그룹
[^][] 안에서의 ^는 일치하지 않음을 의미

정규 표현식을 사용하면 긴 코드를 간결하게 만들 수 있다. 그리고 추후에 전화번호 등의 데이터에서 어떤 패턴을 찾을 때 유용하게 사용할 수 있을 것 같다. 이번 기회에 어떤 상황에서 사용되는지에 대해 알아보며 이해력을 높여야겠다 !!

🤔 느낀점

코드를 작성하고 나서 그대로 끝내는 것이 아닌, 리뷰하는 습관을 가져야겠다고 생각했다. 코드가 잘 실행된다고 끝내면 완벽하게 이해가 안된 느낌! 이번에 7번 문제의 논리 연산과 NOT LIKE때문에 리뷰하고, 이해를 높이기 위해 여러 사이트를 참고했는데 그 시간이 있었기 때문에 완전하게 이해했다!!!!!!!

어떻게 보면 정말 어이없는 질문이지만,,, 나에겐 그 질문이 성장할 수 있는 계기랄까!!! :) 앞으로도 열심히 달려볼 것이다🔥

profile
데이터 분린이 :)

0개의 댓글