코드시그널 사이트에서 SQL 에서 제공하는 키워드 Like 연습하기 좋은 문제를 풀어 내용을 정리하려고 합니다.
사용자 식별을 위해 특수 알고리즘을 사용하는 대규모 웹 사이트를 관리하고 있습니다. 특히 이름과 성 및 일부 추가 메타 데이터만을 기반으로 각 개인에 대한 고유 한 속성을 생성합니다.
오늘 서버 로그를 분석 한 후 웹 사이트 보안이 침해되었으며 일부 사용자의 데이터가 손상되었을 수 있음을 발견했습니다.
사용자 정보는 다음과 같은 구조로 사용자 테이블에 저장됩니다 .
- first_name: 사용자의 이름;
- second_name: 사용자의 성;
- attribute:이 사용자의 고유 한 속성 문자열입니다.
attribute특수 알고리즘의 이전 버전에서 생성 된 사용자 만 영향을받은 것 같습니다. 이러한 속성의 형식은 다음과 같습니다 (대소 문자에 맞게 정확함 ) <one or more arbitrary character>%<first name>_<second name>%<zero or more arbitrary characters>. 가능한 위험에 대해 이러한 속성을 가진 사용자에게 경고하는 것이 이제 귀하의 의무입니다.
사용자 테이블이 주어지면 영향을받는 사용자의 정보를 포함하는 행으로 만 구성된 결과 테이블을 작성하십시오. 결과는 attributes를 기준 으로 오름차순으로 정렬되어야합니다 .
문제를 읽어보면 LIKE의 정규표현식 활용에 대한 문제입니다. 중요한것은 MYSQL에서 문자열 조합으로 매칭되는 데이터를 찾을수 있는가 입니다.
OutPut
first_name | second_name | attribute |
Vicenta | Kravitz | 0%Vicenta_Kravitz% |
Shayne | Dahlquist | 0R0V331K8Q7ypBi4Az3B6Nm0jCqUk%Shayne_Dahlquist%46E3O0u7t7 |
Mikel | Kravitz | PBX86iw1Ied87Z9OarE6sdSLdt%Mikel_Kravitz%W73XOY9YaOgi060r2x12D2EmD7 |
쿼리를 실행하였을때 attribute 가 <한개이상 문자>%first_name_second_name%<0 또는 한개이상 문자>가 되어야합니다.
여기서 MYSQL 로 문제를 해결하기 위해서는 2가지를 생각해야합니다.
- 대소문자를 구분하는지
- 특수문자를 포함하여 매칭되는 문자열을 출력할수 있는지 입니다.
위 2가지를 고려하였을때 아래와 같은 쿼리를 생각하여 실행하였고 결과는 통과했습니다.
SELECT first_name,second_name,attribute
FROM users
WHERE binary(attribute) like concat('_','%\%',first_name,'%\_%',second_name,'\%%','_')
ORDER BY attribute;
- concat 안에 한개이상의 문자열이 오기 위해 '_' 을 넣었고
- 다음으로 '%' 문자를 이스케이프문을 같이 작성하여 %를 같이 조회하도록 하였습니다.
- 그리고 컬럼에 binary 를 입력하여 대소문자를 구분하였습니다.
오랜만에 쿼리 문제를 풀다보니 시간이 오래걸렸지만 재미는 있었습니다.
'알고리즘 > 코드시그널' 카테고리의 다른 글
[CodeSignal- SQL] Group_By - Group Concat 으로 문자열 합치기 (0) | 2021.03.16 |
---|---|
[Code Signal-SQL] Group By 관련 문제 (0) | 2021.03.13 |