나는 이렇게 학습한다/Algorithm & SQL

문자열 내 p와 y의 개수

daco2020 2022. 2. 2. 08:54
반응형

문제 설명

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

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

 

 

제한 사항

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

 

 

해결 방법

1. s를 대문자로 만들어준다.
2. P와 Y의 개수를 각각 구한다.
3. 개수가 서로 일치하는지 확인한다.

 

def solution(s):
    s = s.upper()
    p_cnt, y_cnt = s.count('P'), s.count('Y')
    answer = p_cnt == y_cnt
    return answer

한 줄로 짤 수도 있었지만 가독성과 유지보수를 위해 값을 각 변수에 할당하며 코드를 짰다. 

 

 

 

 

다른 사람들의 풀이를 보니 한 줄로 작성했지만 그때문에 upper() 메서드를 한 번 더 사용하는 경우가 많았다.

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

 

해당 메서드 하나로는 연산에 큰 차이는 없겠지만 실제 현업에서 코드가 추가되거나 수정될 때 과연 좋은 방법인지는 모르겠다.

물론 이 코드는 한 줄로 끝내므로 파일내 세로 줄이 더 적게 든다는 것이 장점이다.

 

 

 

 

또 눈여겨볼만한 점은 collections 모듈의 Counter 함수를 사용한 코드다.

from collections import Counter
def numPY(s):
    c = Counter(s.lower())
    return c['y'] == c['p']

 

이번에 처음보는 모듈인데 Counter라는 함수를 사용하면 해당 문자열을 딕셔너리로 바꾸고 각 문자마다 개수를 세서 키와 값으로 정리해준다. 거기다가 .most_common() 라는 메서드를 사용하면 개수가 많은 순으로 정렬된, 리스트내 튜플 형태의 배열로 반환해준다.

(most_common(숫자) 매서드 안에 숫자를 지정하면 지정 숫자만큼의 데이터만 반환한다)

 

 

 

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

 

 

 

 


 

 

 

레퍼런스

[파이썬] collections 모듈의 Counter 클래스 사용법

반응형