데이터분석 기록일지

문제풀이/프로그래머스

[프로그래머스 Lv.1] 문자열 다루기 기본 (Python)

야하루 2024. 7. 10. 22:23

코딩테스트 연습 - 문자열 다루기 기본 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

 

 

제한 사항

s는 길이 1 이상, 길이 8 이하인 문자열입니다.
s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

 

 

입출력 예
s return
"a234" False
"1234" True

 

 

 


풀이

 

아이디어: 길이가 4 or 6인지 확인하고, 숫자인지 확인해주는 함수 사용

 

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

len(s)의 길이가 4 이거나 6인지 판단하는 조건문을 처음에 걸어주었다.

 

(이때 처음에는 len(s) == 4 or 6 이렇게 했었는데, 이렇게 하면 len(s)==4 혹은 6 을 판단하는 조건문이 된다.

숫자 6은 항상 참이기 때문에 저 코드는 항상 참을 반환하게 된다.)

 

이후 isnumeric()함수로 숫자로 이루어져 있는지 판단하여 true or false를 반환하도록 만들었다.

 

 

 

def solution(s):
    if len(s) == 4 or len(s) ==6:
        try:
            int(s)
            return True
        except:
            return False
    return False

이번에는 try - except 구문을 이용해봤다.

똑같이 길이에 대한 조건을 걸고 s가 int()로 반환되면 True를 안되면 False를 반환하도록 만들었다.

 

 

 


다른 효율적인 풀이

def alpha_string46(s):
    return s.isdigit() and len(s) in [4,6]

이 문제에서는 isnumeric()이나 isdigit() 모두 사용 가능하다.

 

반환값이 True or False 이므로, 조건문에 넣는 대신에 저렇게 return에 넣어서 반환해도 되더라.

(이렇게는 사용이 낯선데 배워야겠다.)

 

len(s) in [4,6] 은 s의 길이가 4 혹은 6일때 True가 나온다.

따라서 and로 묶어  s가 숫자이면서 해당 길이를 만족할 때만 True가 나오고, 아닐때는 False를 반환하도록 한 코드이다.

 

 

def alpha_string46(s):
    try:
        int(s)
    except:
        return False
    return len(s) == 4 or len(s) == 6

나와 같이 try - except 구문을 활용했지만, return에 길이 조건을 걸어준 코드이다.

int(s)가 실행되지 않는다면 except로 가서 False가 나오고

int(s)가 실행된다면, return len(s) == 4 or len(s) == 6 이 실행된다.

따라서 길이가 4 혹은 6이면 True가 나오고 아니라면 False가 출력된다.

 

 

 

이쯤에서 다시 보는 논리 연산자

 

or 연산자는 둘 중 하나라도 참이면 전체 표현식을 참으로 평가
print(4 == 4 or 4 == 6)  # 출력: True
print(5 == 4 or 5 == 6)  # 출력: False
print(6 == 4 or 6 == 6)  # 출력: True

 

and 연산자는 둘 다 참일 때 전체 표현식을 참으로 평가
print(4 == 4 and 6 == 6)  # 출력: True
print(4 == 4 and 5 == 6)  # 출력: False
print(5 == 4 and 7 == 6)  # 출력: False

 

 

 다시 풀이로 돌아와서,

def alpha_string46(s):
    import re
    return bool(re.match("^(\d{4}|\d{6})$", s))

정규 표현식을 사용해서 푼 코드이다.

(정규 표현식의 패턴은 sql에서만 사용되는 줄 알았는데, 파이썬도 있었구나)

 

정규 표현식에서 ^와 $는 문자열의 처음과 끝을 의미하며, \d는 숫자를 의미한다.

{  \d 4} | {  \d 6}은 숫자가 4번 혹은 6번 반복되는 것을 의미하며,

이 조건들을 matach() 함수를 이용해 찾고 최종 결과를 bool 형태인 true/false로 리턴하게 하는 코드이다.

 

 

 


파이썬의 정규 표현식도 시간이 날 때 공부해서 포스팅 해야겠다.