# 1. 언어/# 1.2. TEST

[HackerRank] 문자열 검색/패턴 매칭 (IN/REGEXP)

지지킴 2025. 6. 18. 17:43

https://www.hackerrank.com/challenges/weather-observation-station-6/problem?isFullScreen=true

 

Weather Observation Station 6 | HackerRank

Query a list of CITY names beginning with vowels (a, e, i, o, u).

www.hackerrank.com

 

🚩특정 패턴을 가진 문자열 찾기

-- 1
SELECT city
FROM STATION
WHERE LEFT(CITY,1) IN ('a','e','i','o','u');


-- 2

SELECT CITY
FROM STATION
WHERE CITY REGEXP '^[aeiou]';

 

1. IN 함수 활용

  • INDEX를 활용한다면 빠르게 처리될 수 있음
  • 이 문제처럼 간단하게 문자열의 시작 부분을 특정 문자와 비교하는 경우엔 IN이 REGEXP보다 성능 면에서 더 유리할 수 있음
    • IN + Index 작동 과정
      1. 인덱스에서 '주소' 찾기: 
        • 데이터베이스는 CITY 컬럼에 걸려있는 인덱스로 찾아감 (CITY컬럼에 INDEX가 걸려있다는 전제 하)
        • 인덱스 안에서 IN ('a','e','i','o','u') 조건에 해당하는 CITY 값들 (예: 'Apple', 'Everest' 등)을 찾음
        • 인덱스에는 각 CITY 값 옆에 그 값이 저장된 테이블 행의 '주소'가 기록되어 있는데, 데이터베이스는 이 조건에 맞는 CITY 값들의 '주소 목록'을 뽑아냄
      2. '주소' 보고 '행' 가져오기:
        • 데이터베이스는 이 '주소 목록'을 들고 테이블로 감
        • 테이블은 데이터가 실제 저장된 곳인데, 데이터베이스는 목록에 있는 주소들만 보고 해당 주소에 있는 '행' 전체를 가져옴
        • 🚨 테이블의 모든 행을 다 읽는 게 아니라, 인덱스에서 찾은 주소에 해당하는 행들만 골라서 가져옴
      3. 결과값 만들기:
        • 가져온 행들에서 SELECT 절에 명시된 컬럼들만 뽑아내서 최종 결과로 보여줌

 2. REGEXP 활용

  • INDEX 활용을 잘 하진 못함
  • 특히 패턴이 문자열의 중간, 끝 부분을 찾는 경우라면 거의 대부분 FULL SCAN을 함 -> 성능 저하
  • REGEXP 작동 과정 (인덱스 활용이 어려운 경우)
    1. 테이블의 첫 행부터 시작:
      • 데이터베이스는 REGEXP 조건을 만나면, '주소록'(인덱스)을 쓰는 대신 테이블의 맨 첫 번째 행으로 찾아감
      • 그리고 그 행을 통째로 읽어 들임(모든 컬럼 데이터를 일단 가져옴)
    2. 읽어온 행에서 REGEXP 검사:
      • 읽어온 행에서 REGEXP 조건에 사용된 컬럼 (CITY 컬럼)의 값을 가져옴.
      • 이 값을 REGEXP 엔진에 넘기면 REGEXP 엔진은 정규 표현식 패턴(^[aeiou])이 이 CITY 값에 맞는지에 대한 검사를 시작함
      • 검사 결과, 패턴에 맞으면 이 행은 결과 후보 목록에 올라감 (패턴에 안 맞는 행은 버려짐)
    3. 다음 행으로 이동하며 반복:
      • 첫 번째 행 검사가 끝나면, 데이터베이스는 테이블의 다음 행으로 넘어감
      • 그리고 또 그 행을 통째로 읽어 들여서 CITY 컬럼 값을 가져와 REGEXP 엔진으로 검사하는 과정을 테이블의 마지막 행까지 계속 반복
    4. 결과값 만들기:
      • 이렇게 테이블의 모든 행을 다 검사한 후에, 패턴에 맞아서 결과 후보 목록에 올라간 행들에서 SELECT 절에 명시된 컬럼들 (CITY)의 값만 뽑아내서 최종 결과로 보여줌.

* IN을 사용할 수 있는 상황이라면, 조건이 사용되는 컬럼에 인덱스를 걸고 IN을 활용하는 것이 더 효율적! 빠르다!

 


https://www.hackerrank.com/challenges/weather-observation-station-12/problem?isFullScreen=true

 

Weather Observation Station 12 | HackerRank

Query an alphabetically ordered list of CITY names not starting and ending with vowels.

www.hackerrank.com

🚩위의 문제와 동일한 데이터를 사용하나, 이번엔 CITY의 첫,끝 글자가 aeiou가 아닌 CITY를 찾는 문제.

 

--1 
SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY,1) NOT IN ('a','e','i','o','u')
AND RIGHT(CITY,1) NOT IN ('a','e','i','o','u')
 
 --2
SELECT DISTINCT CITY
FROM STATION
WHERE CITY REGEXP '^[^aeiou].*[^aeiou]$'

 

1은 익숙하니 pass.

2의 정규표현식을 기억하기 위해 기록함.

^[^aeiou].*[^aeiou]$ => 이 정규표현식은 총 3개의 단위로 끊어 읽을 수 있음

  • ^[^aeiou] : 모음으로 시작(^[])하지 않는(^aeiou) 글자
    • ^가 []의 안에 있을 땐, 뒤에 오는 문자들을 제외한다는 뜻
  • .* :
    • .(period)는 어떤 한 글자를 나타내고, *는 바로 앞에 있는 구문이 0번 이상 반복될 수 있음을 의미.
    • 따라서 .*이 합쳐져서 "어떤 한 글자가 0번 이상 반복될 수 있다"를 의미
  • [^aeiou]$: 모음으로 끝($)나지 않는 문자
    • $는 문자열의 끝을 의미
    • 따라서 전체 구문은 문자열이 끝날 때, 그 마지막 글자가 모음이 아닌 어떤 한 글자여야 함을 뜻함