여러가지/알고리즘 & 자료구조

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

hyeseong-dev 2024. 10. 14. 00:32

문제 설명
주어진 문자열 s에서 대소문자 구분 없이 문자 'p''y'의 개수를 비교하여, 개수가 같으면 True, 다르면 False를 반환하는 문제입니다.
또한, 'p''y'가 모두 하나도 없는 경우에도 True를 반환해야 합니다.


제한 사항

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

입출력 예

s answer
"pPoooyY" true
"Pyy" false
  • 입출력 예 #1: 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 반환합니다.
  • 입출력 예 #2: 'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 반환합니다.

문제 풀이

이 문제에서는 주어진 문자열에서 대소문자를 구분하지 않고 'p''y'의 개수를 비교해야 합니다. 이를 위해 문자열을 모두 소문자 또는 모두 대문자로 변환한 뒤, 각 문자의 개수를 비교하는 방식으로 해결할 수 있습니다.

1. Python 코드 풀이

def solution(s):
    # 문자열을 모두 소문자로 변환
    s = s.lower()

    # 'p'의 개수와 'y'의 개수를 각각 세기
    return s.count('p') == s.count('y')

# 테스트 예시
print(solution("pPoooyY"))  # 출력: True
print(solution("Pyy"))      # 출력: False

코드 설명

  1. s.lower()를 통해 문자열 s모두 소문자로 변환합니다.
    • 이렇게 하면 대소문자를 구분하지 않고 비교할 수 있습니다.
  2. s.count('p')s.count('y')를 사용하여 'p''y'의 개수를 각각 세고, 두 값이 같으면 True, 다르면 False를 반환합니다.
    • 'p''y'가 모두 없는 경우에는 둘 다 0이므로, 이 경우에도 True가 반환됩니다.

2. Java 코드 풀이

class Solution {
    boolean solution(String s) {
        // 문자열을 모두 소문자로 변환
        s = s.toLowerCase();

        // 'p'와 'y'의 개수를 카운트할 변수
        int pCount = 0;
        int yCount = 0;

        // 문자열을 순회하며 'p'와 'y'의 개수 세기
        for (char c : s.toCharArray()) {
            if (c == 'p') {
                pCount++;
            } else if (c == 'y') {
                yCount++;
            }
        }

        // 'p'의 개수와 'y'의 개수가 같으면 true, 다르면 false
        return pCount == yCount;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.solution("pPoooyY"));  // 출력: true
        System.out.println(sol.solution("Pyy"));      // 출력: false
    }
}

코드 설명

  1. s.toLowerCase()를 사용하여 문자열을 모두 소문자로 변환합니다.
    • 이렇게 하면 대소문자를 구분하지 않고 비교할 수 있습니다.
  2. pCountyCount를 사용하여 'p''y'의 개수를 세고, 문자열을 순회하면서 해당 문자가 'p'이면 pCount를 증가시키고, 'y'이면 yCount를 증가시킵니다.
  3. 최종적으로 'p''y'의 개수가 같으면 true, 다르면 false를 반환합니다.

3. 시간 복잡도 분석

  • 시간 복잡도: 문자열의 길이가 n일 때, 문자열을 한 번 순회하면서 'p''y'의 개수를 세므로, 시간 복잡도는 O(n)입니다.
    • Python에서는 s.count() 함수도 내부적으로 문자열을 한 번 순회하기 때문에 O(n)입니다.

결론

이 문제는 문자열을 대소문자 구분 없이 특정 문자의 개수를 세고 비교하는 문제로, lower() 또는 toLowerCase()와 같은 메서드를 활용하여 간단하게 해결할 수 있습니다. 시간 복잡도는 O(n)으로, 주어진 제한 내에서 매우 효율적으로 처리할 수 있습니다.