본문 바로가기
프로그래밍 언어/SQL

[프로그래머스 SQL 문제] 루시와 엘라 찾기

by gokite 2021. 8. 25.

https://programmers.co.kr/learn/courses/30/lessons/59046

 

코딩테스트 연습 - 루시와 엘라 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

너무 쉬운 문제여서 한 번에 정답이긴 했지만, 어떤분이 정규식으로 찾는 걸 보았다!

생각 못했던 부분이라 짚고 넘어가는 걸로!! 

 

 

 

정규식 함수

=> 표준 구문 규칙을 사용하여 문자열 데이터의 간단한 패턴 및 복잡한 패턴을 검색하고 조작할 수 있으며,

  자연어 처리에 큰 효율을 발휘하는 함수임! 즉 문자열 데이터에서 큰 힘을 발휘하는 함수임. 물론 LIKE 라는 함수도 있

  지만 정규식을 이용하면 더 다양하고 상세한 결과값을 사용할 수 있음.!!

 

함수 설명
REGEXP_LIKE LIKE 연산자와 유사하지만 간단한 조건 대신 정규식 일치를 수행함
REGEXP_REPLACE 정규식 패턴을 검색하여 대체 문자열로 바꿈
REGEXP_INSTR 정규식 패턴에 대해 문자열을 검색하고 일치하는 위치를 반환
REGEXP_SUBSTR 지정된 문자열 내에서 정규식 패턴을 검색하고 일치하는 부분 문자열을 추출
REGEXP_COUNT 입력 문자열에서 패턴일치가 발견되는 횟수 반환

기본 함수의 본질은 같으나 정규식으로 조건을 건다는 것이 다른듯 하다.

 

 

ex) 이름에 'AR' 'N' 이 들어간 학생의 이름을 출력하라 

 

1. 보통 일반 함수 LIKE를 사용했을 때

select name 
from table
where name like ('%ar%') or ('%n%')

2. 정규식 함수를 사용했을 때

select name
from table
where regexp_like (name, '(ar|n)')

 

 

 

그렇다면 어떤분이 제기하신 코드를 봐보자!

SELECT ANIMALID, NAME, SEXUPONINTAKE
FROM ANIMALINS
WHERE NAME REGEXP 'Lucy|Ella|Pickle|Rogan|Sabrina|Mitty'
ORDER BY ANIMAL_ID

앞서 본 것처럼 정답일 것 같지만 오답이 나온다.

REGEXP 는 문자열 내부에 어떤 부분이든 해당 정규식이 존재하면 True 이기 때문이다.

즉 hiLucy 라는 이름의 동물이 있다면, 안에 Lucy 라는 이름이 있기때문에 통과를 해버린다!

 

 

 

이걸 바르게 고쳐보자.

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME regexp "^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$"
ORDER BY ANIMAL_ID

이렇게 메타문자(^, $) 를 설정해서 처음과 끝을 지정해줘야한다.