Slow is better than NOTHING

Programmers 풀이/[LEVEL 1]

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

Jeff_Kang 2019. 5. 31. 19:19
반응형

- 문제 설명

 

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

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

 

- 제한사항

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

 

 

import collections as col
def solution(s):
    a=col.Counter(s.lower())
    result=[]
    for i in range(len(a.keys())):
        if list(a.keys())[i] == 'p' or list(a.keys())[i]=='y':
            result.append(list(a.values())[i])
    if len(result) >1 :
        if(result[0] == result[1]):
            return True
        else:
            return False
    elif len(result)==0:
        return True
    else:
        return False

저는 Counter 객체를 사용해서 전체 배열에 주어진 동일 문자들의 갯수를 파악해보았습니다. Counter객체에 s.lower()라는 메소드를 통해 문자열을 모두 소문자로 바꾸어 넣은 'a' 는 각 문자의 요소와 문자열에 들어있는 count값을 딕셔너리 형태로 반환해줍니다. 

ex) 예제 1 반환값 : Counter({'o': 3, 'p': 2, 'y': 2})

ex) 예제 2 반환값 : Counter({'y': 2, 'p': 1})

이제 이 반환된 값에서 key가 p 또는 y 일 때 각 값에 대한 value가 같은지 비교하면 됩니다. 이때 주의할 점은  'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴하는 것이므로 반환된 리스트의 길이가 0 이라면 p,y가 아무것도 없는것이므로 True를, 길이가 1이라면 p와 y 둘 중 하나만 있는 것이므로 비교가 불가능하여 False를 리턴해야합니다.

 

 

ps) 다른 사람의 코드

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

Counter 객체를 사용한것은 동일하지만 이렇게 비교가 가능한지는 처음알았네요.. 결과에 대해 하나하나 비교하고 나온 결과값을 또 if문을 통해 검사하는 저의 코드보다 훨씬 간결하고 파이썬스러운 코드인것 같습니다.

반응형