본문 바로가기

TIL

[240226] SQL: 코드카타 132~140(right/left) & 파이썬: 코드카타 36(isdecimal/isdigit/isnumeric)

[SQL 코드카타]

Weather Observation Station 8

https://www.hackerrank.com/challenges/weather-observation-station-8/problem

 

1) 어떤 문제가 있었나

도시 이름의 시작과 끝 음절이 모음(a,e,i,o,u)인 도시 이름을 출력하는 문제 

 

2) 내가 시도해본 건 무엇인가

시작 음절은 subtring으로, 마지막 음절은 like + % 를 활용하여 필터링 

 

3) 어떻게 해결했나

select distinct CITY 
 from STATION 
 where substring(CITY, 1, 1) in ('a', 'e', 'i', 'o', 'u')
     and( CITY like '%a' 
      or CITY like '%e'
      or CITY like '%i'
      or CITY like '%o'
      or CITY like '%u')


4) 무엇을 새롭게 알았나

- regexp 함수를 활용해 정규식의 시작 규칙(^)과 끝 규칙($)으로 조건 설정 가능 

- left, right, mid 함수로 문자열에 따라 음절 개수를 정할 수 있음  

└ left(칼럼명, n): 문자열 왼쪽 방향 부터 n개 문자 추출 

└ right(칼럼명, n): 문자열 오른쪽 방향 부터 n개 문자 추출 

└ mid(칼럼명, m, n): 문자열 m번째 자릿수부터 n개 문자 추출 

# regexp 함수 + 정규식
select distinct city
from STATION
where city REGEXP '^[a,e,i,o,u]'
      and city REGEXP '[a,e,i,o,u]$';
    
# LEFT, RIGHT 함수 
select distinct city 
from station 
where (left(city,1) in ('a','e','u','i','o')) 
	   and (right(city,1) in ('a','e','u','i','o'));

 


[파이썬 코드카타]

문자열 다루기 기본

https://school.programmers.co.kr/learn/courses/30/lessons/12918

 

1) 어떤 문제가 있었나

주어진 문자열이 0-9까지 숫자로만 이뤄져 있으면 True, 영문 알파벳이 섞여 있으면 False를 반환하는 문제 

 

2) 내가 시도해본 건 무엇인가

- a~z, A~Z까지 영문 알파벳을 모두 포함한 리스트 생성 후, s의 특정 문자열이 문자열에 속하면 False 반환 > 60점 오답

# 오답 코드
lower_list = [chr(x) for x in range(97, 123)]
upper_list = [chr(x) for x in range(65, 91)]

str_list = lower_list+ upper_list

def solution(s):
    for i in range(len(s)):
        if s[i] in str_list:
            return False
        else: 
            return True

 

- s를 int 함수로 감쌌을 때 오류가 발생하면 Fase, 아니면 True 반환  > 86.7점 오답

def solution(s):
    try:
        int(s)
        return True

    except: 
        return False

 

3) 어떻게 해결했나

- 프로그래머스 힌트 페이지를 통해서 [문자열 s의 길이가 4 혹은 6]이라는 조건이 누락됨을 확인

- 다른 사람 풀이를 통해 숫자인지 판별하는 isdecimal() / isdigit() / isnumeric() 함수 확인 

def solution(s):
    if (len(s) == 4 or len(s) == 6) and (s.isdecimal()):
        return True
    else: 
        return False

# 오류 케이스 있음
# len(s)가 4가 아닐 때 Ture/False가 아니라 6이 출력되기 때문
def solution(s):
    if (len(s) == 4 or 6) and (s.isdecimal()):
        return True
    else: 
        return False


4) 무엇을 새롭게 알았나

- 문제를 풀 때 문제를 꼼꼼하게 읽는 습관이 중요!

- 주어진 문자열이 숫자인 판별하는 함수

isdecimal(): int형으로 변환이 가능하다면 True를 반환하는 함수 
isdigit(): 단일 글자가 '숫자' 모양으로 생겼으면  True를 반환하는 함수 

isnumeric(): 제곱근 및 분수, 거듭제곱 특수문자를 포함해 숫자값 표현에 해당한다면 True를 반환하는 함수 

- 조건절에 변수를 명확하게 지정해야 함 (a - 오답, b는 정답)

s = "a23431"

a = len(s) == 4 or 6
b = len(s) == 4 or len(s) == 6

print(a) # 6
print(b) # True