본문 바로가기

Skill Sets/Python

[Python] 문자열 내 p와 y의 개수(프로그래머스/python/Level 1)

SMALL

안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "문자열 내 p와 y의 개수" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/12916)

 


 

1. 문제 :  문자열 내 p와 y의 개수(Lv. 1)

 


 

2. 문제 설명

 

대문자와 소문자가 섞여있는 문자열 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
"ABC" True

 

[ 입출력 예 설명 ]

 

입출력 예 #1
'p'의 개수 2개, 'y'의 개수 2개로 같으므로 True를 return 합니다.

입출력 예 #2
'p'의 개수 1개, 'y'의 개수 2개로 다르므로 False를 return 합니다.

 

입출력 예 #3
'p'의 개수 0개, 'y'의 개수 0개로 모두 하나도 없으므로 True를 return 합니다.

 


 

3. 문제 풀이

# 1안
def solution(s):
    P_list = []
    Y_list = []
    for i in range(len(s)):
        if s[i].upper() == 'P':
            P_list.append(1)
        if s[i].upper() == 'Y':
            Y_list.append(1)
    if len(P_list) == len(Y_list):
        answer = True
    else :
        answer = False
    return answer

# 2안
def solution(s):
    s_upper = s.upper()
    if s_upper.count('P') == s_upper.count('Y'): 
        answer = True
    else:
        answer = False
    return answer

문제 설명에 맞는 코드를 작성하기 위해서 총 2안으로 작성했습니다!

 

#  1안 풀이 설명

# [ 문제 풀이 설명 ]

 

문제와 입출력 예시를 보며, 입력된 문자열 s의 길이만큼 반복문 실행이 필요하겠다고 생각을 했습니다!

 

len(s)를 통해 길이를 구하여 반복문을 실행해 주었습니다.

 

P의 갯수를 담는 P_list와 Y의 갯수를 담는 Y_list를 생성하였고

 

문자열 s의 길이 만큼 반복문을 실행하면서

 

s의 각 자리의 문자를 불러오고 upper()를 통해 대문자로 변환을 해주었어요!

 

이후 P이면 P_list에 1을 append 해주고,  Y이면 Y_list에 1을 append 해주었습니다.

 

반복문이 끝난 이후에는 P_list와 Y_list의 개수를 비교해서

 

개수가 동일하면 True, 동일하지 않으면 False를 answer 변수에 할당에주고

 

answer를 return 해주었습니다.

 

 

s = "Pyy"를 예로 들어볼게요!

 

"Pyy"의 길이는 3자리이므로 i는 0부터 2까지 반복을 해주고

 

i가 0인 경우 "Pyy"의 0번째 index 값은 'P' > upper를 통해 대문자로 변환 > 'P' > P_list에 1을 append

i가 1인 경우 "Pyy"의 1번째 index 값은 'y' > upper를 통해 대문자로 변환 > 'Y' > Y_list에 1을 append

i가 2인 경우 "Pyy"의 2번째 index 값은 'y' > upper를 통해 대문자로 변환 > 'Y' > Y_list에 1을 append

 

P_list = [1] > len(P_list) = 1

Y_list = [1,1] > len(Y_list) = 2

 

값이 다르므로, answer = False

 

이후 answer 변수를 return 해주었습니다!

 

# 1안

def solution(s):
    # P_list와 Y_list 선언

    P_list = []
    Y_list = []
    # s의 길이만큼 반복문 실행

    for i in range(len(s)):
        # s의 각 자리수를 살펴보며 P인지 Y인지 확인

        if s[i].upper() == 'P':
            P_list.append(1)
        if s[i].upper() == 'Y':
            Y_list.append(1)
    # P_list와 Y_list 길이를 비교

    # 동일하면 True
    if len(P_list) == len(Y_list):
        answer = True
    # 동일하지 않으면 False

    else :
        answer = False
    return answer

 

#  2안 풀이 설명

# [ 문제 풀이 설명 ]

 

2안의 코드는 1안의 코드와 동일한 내용이에요!

 

1안은 가장 처음에 들었던 생각을 코드로 구현한 것이였는데요!

 

그러다보니 비효율적인 부분이 존재해서

 

이를 개선한 코드가 2안의 코드입니다!

 

입력받은 문자열 s를 upper()를 통해 모두 대문자로 변경하고

 

count()를 통해 P와 Y의 개수를 바로 비교하였습니다!  

 

s = "Pyy"를 예로 들어볼게요!

 

s를 upper를 통해 대문자로 변환, s_upper = "PYY"

 

"PYY"에서 P의 개수 = 1

 

"PYY"에서 Y의 개수 = 2

 

값이 다르므로, answer = False

 

이후 answer 변수를 return 해주었습니다!

 

# 2안

def solution(s):
    # upper()를 이용해 s를 대문자로 변경

    s_upper = s.upper()
    # count()를 이용해 'P'와 'Y'의 개수를 비교

    # 동일하면 True
    if s_upper.count('P') == s_upper.count('Y'): 
        answer = True
    # 동일하지 않으면 False
        answer = False
    return answer

 


 

4. 문제 풀이 후기

 

이번 문제는 문자열 s을 입력받아,

 

대문자와 소문자를 구분하지 않고 P와 Y의 개수를 비교하는 문제였습니다.

 

이번에 푼 문제도 반복문과 append()를 활용해 배열에 저장하는 것이 특징이네요!

 

1안보다는 2안의 접근법이 더 적절한 것으로 보입니다!

 

그래도 1안을 첨부한 이유는

 

자신이 생각하는 것을 코드로 구현하는 능력도 필요하다고 생각해서 넣어보았어요!

 

2안보다 더 효율적인 코드도 분명 존재할 것이라고 생각합니다! :)

 

이 외에는 어려운 부분이 없어서 제가 따로 코멘트할 것은 없습니다!

 



이번 포스팅은 프로그래머스에 있는

 

python을 이용한 코딩테스트 문제를 풀어보았습니다!

 

너무 쉬운 부분만 있다면 이번 포스팅처럼 다른 풀이 방법도 설명하면서 진행하려고 해요!

 

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

LIST