[프로그래머스] Lv1. 문자열 내 p와 y의 개수

1 분 소요

문제

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 ‘p’의 개수와 ‘y’의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. ‘p’, ‘y’ 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 “pPoooyY”면 true를 return하고 “Pyy”라면 false를 return합니다.

제한 조건

  • 문자열 s의 길이 : 50 이하의 자연수
  • 문자열 s는 알파벳으로만 이루어져 있습니다.

나의 풀이:

def solution(s):
    p = 0
    y = 0
    answer = True
    for i in s:
        if i == 'p' or i == 'P':
            p+=1
        elif i == 'y' or i == 'Y':
            y+=1
    if p != y: answer = False
    return answer

문제를 풀기위해 가장 처음에 작성했던 코드다. 대소문자를 구분하지 않고 개수를 비교해야하기 때문에 OR을 사용하여 elif문의 반복 사용을 줄였다.

def solution(s):
    answer = True
    p = len([i for i in s if i == 'p' or i == 'P'])
    y = len([i for i in s if i == 'y' or i == 'Y'])
    if p != y: answer = False
    return answer

처음에 작성한 코드를 바로 제출하지 않고 개선할 방법을 찾아보려고 했다. 그래서 나온 것이 위의 두번째 코드다. 라인의 수는 많이 줄여서 코드를 보기 좋게 만들기는 했지만 이렇게 할 경우 for문으로 문자열 s를 검사하는 과정이 두번으로 늘어나게 된다.

시간복잡도는 여전히 O(n)이지만, for문 실행수가 2n 이라서 결국 다시 처음에 작성했던 코드로 최종 제출을 했다.

다른 사람들의 풀이

def solution(s):
    return s.lower().count('p') == s.lower().count('y')

내가 기억해내지 못한 함수를 활용하여 훨씬 깔끔한 코드를 작성한 모습이다.

  • .lower() 또는 .upper() 함수는 문자열을 소문자 또는 대문자로 통일시켜준다. 이렇게 하면 굳이 대소문자를 구분해서 반복하여 확인 할 필요가 없다.
  • .count() 함수는 문자열 안의 특정 갋의 개수를 세준다.
  • 굳이 True, False 값을 변수에 담을 필요없이 return문에서 바로 비교연산자를 사용하여 Boolean 값을 반환하도록 했다.

댓글남기기