ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13. 문자열 내 p와 y의 개수
    코딩 테스트/Level 1 2019. 10. 11. 20:26
    반응형

    https://programmers.co.kr/learn/courses/30/lessons/12916

     

    파이썬

    정석적인 풀이.

    if in 튜플 부분이 파이써닉합니다.

    def solution(s):
        p_count, y_count = 0, 0
        for each in s:
            if each in ('p', 'P'):
                p_count += 1
            elif each in ('y', 'Y'):
                y_count += 1
        return p_count == y_count
    테스트 1 〉	통과 (0.00ms, 10.1MB)
    테스트 2 〉	통과 (0.00ms, 10.1MB)
    테스트 3 〉	통과 (0.00ms, 10.3MB)
    테스트 4 〉	통과 (0.00ms, 10.2MB)
    테스트 5 〉	통과 (0.00ms, 10.2MB)
    테스트 6 〉	통과 (0.01ms, 10.1MB)
    테스트 7 〉	통과 (0.01ms, 10.1MB)
    테스트 8 〉	통과 (0.01ms, 10.2MB)
    테스트 9 〉	통과 (0.01ms, 10.3MB)
    테스트 10 〉	통과 (0.01ms, 10.2MB)
    테스트 11 〉	통과 (0.01ms, 10.1MB)
    테스트 12 〉	통과 (0.01ms, 10.1MB)
    테스트 13 〉	통과 (0.01ms, 10.1MB)
    테스트 14 〉	통과 (0.01ms, 10.2MB)
    테스트 15 〉	통과 (0.01ms, 10.2MB)
    테스트 16 〉	통과 (0.01ms, 10.2MB)
    테스트 17 〉	통과 (0.01ms, 10.2MB)
    테스트 18 〉	통과 (0.01ms, 10.1MB)
    테스트 19 〉	통과 (0.01ms, 10.1MB)
    테스트 20 〉	통과 (0.01ms, 10.1MB)
    테스트 21 〉	통과 (0.01ms, 10.1MB)
    테스트 22 〉	통과 (0.01ms, 10.2MB)
    테스트 23 〉	통과 (0.01ms, 10.2MB)
    테스트 24 〉	통과 (0.01ms, 10.3MB)
    테스트 25 〉	통과 (0.01ms, 10.3MB)
    테스트 26 〉	통과 (0.01ms, 10.2MB)
    테스트 27 〉	통과 (0.01ms, 10.1MB)
    테스트 28 〉	통과 (0.01ms, 10.3MB)
    테스트 29 〉	통과 (0.00ms, 10.1MB)
    테스트 30 〉	통과 (0.01ms, 10.2MB)

    한 줄로 할 수 있는 건 한 줄로...
    count 메서드를 쓸 때마다 s 문자열을 1번씩 순환합니다.
    아래 코드는 총 4회의 순환을 하기 때문에
    '일반적인 관점'에서 좋은 코드는 아닙니다. 
    벤치마크로는 가장 빠릅니다만.....

    def solution(s):
        return s.count('p') + s.count('P') == s.count('y') + s.count('Y')
    테스트 1 〉	통과 (0.00ms, 10.1MB)
    테스트 2 〉	통과 (0.00ms, 10.3MB)
    테스트 3 〉	통과 (0.00ms, 10.2MB)
    테스트 4 〉	통과 (0.01ms, 10.3MB)
    테스트 5 〉	통과 (0.00ms, 10.1MB)
    테스트 6 〉	통과 (0.00ms, 10.1MB)
    테스트 7 〉	통과 (0.00ms, 10MB)
    테스트 8 〉	통과 (0.00ms, 10.1MB)
    테스트 9 〉	통과 (0.00ms, 10.1MB)
    테스트 10 〉	통과 (0.00ms, 10.1MB)
    테스트 11 〉	통과 (0.00ms, 10.1MB)
    테스트 12 〉	통과 (0.00ms, 10MB)
    테스트 13 〉	통과 (0.00ms, 10.2MB)
    테스트 14 〉	통과 (0.00ms, 10.2MB)
    테스트 15 〉	통과 (0.00ms, 10.1MB)
    테스트 16 〉	통과 (0.00ms, 9.94MB)
    테스트 17 〉	통과 (0.00ms, 10.2MB)
    테스트 18 〉	통과 (0.00ms, 10.1MB)
    테스트 19 〉	통과 (0.00ms, 10.3MB)
    테스트 20 〉	통과 (0.00ms, 10MB)
    테스트 21 〉	통과 (0.00ms, 10.2MB)
    테스트 22 〉	통과 (0.00ms, 10.1MB)
    테스트 23 〉	통과 (0.00ms, 10.1MB)
    테스트 24 〉	통과 (0.00ms, 10.3MB)
    테스트 25 〉	통과 (0.00ms, 10.2MB)
    테스트 26 〉	통과 (0.00ms, 10.1MB)
    테스트 27 〉	통과 (0.00ms, 10.1MB)
    테스트 28 〉	통과 (0.00ms, 10.1MB)
    테스트 29 〉	통과 (0.00ms, 10.1MB)
    테스트 30 〉	통과 (0.00ms, 10.3MB)

    2회의 반복입니다. 

    def solution(s):
        return len([each for each in s if each in ('p', 'P')]) == len([each for each in s if each in ('y', 'Y')])
    테스트 1 〉	통과 (0.00ms, 10.1MB)
    테스트 2 〉	통과 (0.01ms, 10.1MB)
    테스트 3 〉	통과 (0.00ms, 10.1MB)
    테스트 4 〉	통과 (0.01ms, 9.96MB)
    테스트 5 〉	통과 (0.01ms, 10.2MB)
    테스트 6 〉	통과 (0.01ms, 10.1MB)
    테스트 7 〉	통과 (0.01ms, 10.2MB)
    테스트 8 〉	통과 (0.02ms, 10.1MB)
    테스트 9 〉	통과 (0.02ms, 10.2MB)
    테스트 10 〉	통과 (0.02ms, 10.1MB)
    테스트 11 〉	통과 (0.02ms, 10.1MB)
    테스트 12 〉	통과 (0.01ms, 10.1MB)
    테스트 13 〉	통과 (0.01ms, 10.2MB)
    테스트 14 〉	통과 (0.01ms, 10.3MB)
    테스트 15 〉	통과 (0.01ms, 10.1MB)
    테스트 16 〉	통과 (0.01ms, 10.2MB)
    테스트 17 〉	통과 (0.02ms, 10.1MB)
    테스트 18 〉	통과 (0.01ms, 10.1MB)
    테스트 19 〉	통과 (0.02ms, 10.1MB)
    테스트 20 〉	통과 (0.01ms, 10.1MB)
    테스트 21 〉	통과 (0.01ms, 10.2MB)
    테스트 22 〉	통과 (0.01ms, 10.2MB)
    테스트 23 〉	통과 (0.01ms, 9.95MB)
    테스트 24 〉	통과 (0.01ms, 10.1MB)
    테스트 25 〉	통과 (0.01ms, 10.1MB)
    테스트 26 〉	통과 (0.02ms, 10.1MB)
    테스트 27 〉	통과 (0.01ms, 10.2MB)
    테스트 28 〉	통과 (0.01ms, 10.3MB)
    테스트 29 〉	통과 (0.00ms, 10.1MB)
    테스트 30 〉	통과 (0.01ms, 10.3MB)

    정규식을 이용, 2회 반복입니다. 
    https://wikidocs.net/4308

    import re
    
    
    def solution(s):
        return len(re.findall(r'[pP]', s)) == len(re.findall(r'[yY]', s))

    속도도 그닥...

    테스트 1 〉	통과 (0.10ms, 10.1MB)
    테스트 2 〉	통과 (0.10ms, 10.2MB)
    테스트 3 〉	통과 (0.10ms, 10.1MB)
    테스트 4 〉	통과 (0.10ms, 10.3MB)
    테스트 5 〉	통과 (0.14ms, 10MB)
    테스트 6 〉	통과 (0.10ms, 10MB)
    테스트 7 〉	통과 (0.10ms, 10.3MB)
    테스트 8 〉	통과 (0.12ms, 10.2MB)
    테스트 9 〉	통과 (0.10ms, 10.1MB)
    테스트 10 〉	통과 (0.11ms, 10.1MB)
    테스트 11 〉	통과 (0.10ms, 10.2MB)
    테스트 12 〉	통과 (0.13ms, 10.3MB)
    테스트 13 〉	통과 (0.10ms, 10.2MB)
    테스트 14 〉	통과 (0.10ms, 10.1MB)
    테스트 15 〉	통과 (0.10ms, 10.2MB)
    테스트 16 〉	통과 (0.10ms, 10.1MB)
    테스트 17 〉	통과 (0.19ms, 10.1MB)
    테스트 18 〉	통과 (0.20ms, 10.2MB)
    테스트 19 〉	통과 (0.10ms, 10.3MB)
    테스트 20 〉	통과 (0.10ms, 10.2MB)
    테스트 21 〉	통과 (0.10ms, 10.2MB)
    테스트 22 〉	통과 (0.10ms, 10.1MB)
    테스트 23 〉	통과 (0.13ms, 10.3MB)
    테스트 24 〉	통과 (0.10ms, 10.2MB)
    테스트 25 〉	통과 (0.10ms, 10.1MB)
    테스트 26 〉	통과 (0.10ms, 10.3MB)
    테스트 27 〉	통과 (0.15ms, 10.3MB)
    테스트 28 〉	통과 (0.10ms, 10.1MB)
    테스트 29 〉	통과 (0.09ms, 10.1MB)
    테스트 30 〉	통과 (0.10ms, 10.2MB)

    컴파일 옵션을 이용해도 되죠. 

    IGNORECASE(I) - 대소문자에 관계없이 매치할 수 있도록 한다.
    옵션을 사용할 때는 re.DOTALL처럼 전체 옵션 이름을 써도 되고 re.S처럼 약어를 써도 된다.

    import re
    
    
    def solution(s):
        return len(re.findall('p', s, re.I)) == len(re.findall('y', s, re.I))

    컴파일 옵션(re.I)을 이용하면 조금 더 빠르군요. 

    테스트 1 〉	통과 (0.07ms, 10.3MB)
    테스트 2 〉	통과 (0.10ms, 10.1MB)
    테스트 3 〉	통과 (0.07ms, 10.3MB)
    테스트 4 〉	통과 (0.07ms, 10.2MB)
    테스트 5 〉	통과 (0.07ms, 10.2MB)
    테스트 6 〉	통과 (0.08ms, 10.2MB)
    테스트 7 〉	통과 (0.08ms, 10.2MB)
    테스트 8 〉	통과 (0.08ms, 10.1MB)
    테스트 9 〉	통과 (0.10ms, 10.2MB)
    테스트 10 〉	통과 (0.08ms, 10.1MB)
    테스트 11 〉	통과 (0.08ms, 10.2MB)
    테스트 12 〉	통과 (0.08ms, 10.3MB)
    테스트 13 〉	통과 (0.11ms, 10.2MB)
    테스트 14 〉	통과 (0.08ms, 10.2MB)
    테스트 15 〉	통과 (0.08ms, 10.2MB)
    테스트 16 〉	통과 (0.08ms, 10.2MB)
    테스트 17 〉	통과 (0.09ms, 10.3MB)
    테스트 18 〉	통과 (0.11ms, 10.3MB)
    테스트 19 〉	통과 (0.11ms, 10.2MB)
    테스트 20 〉	통과 (0.08ms, 10.2MB)
    테스트 21 〉	통과 (0.10ms, 10.2MB)
    테스트 22 〉	통과 (0.11ms, 10.2MB)
    테스트 23 〉	통과 (0.10ms, 10.1MB)
    테스트 24 〉	통과 (0.08ms, 10.2MB)
    테스트 25 〉	통과 (0.08ms, 10.3MB)
    테스트 26 〉	통과 (0.11ms, 10.2MB)
    테스트 27 〉	통과 (0.08ms, 10.3MB)
    테스트 28 〉	통과 (0.08ms, 10.2MB)
    테스트 29 〉	통과 (0.10ms, 10.3MB)
    테스트 30 〉	통과 (0.09ms, 10.2MB)

     

    자바스크립트

    정규식 이용

    function solution(s){
        return (s.match(/p/gi) || []).length == (s.match(/y/gi) || []).length
    }

     

    자바

    정석적입니다. 제가 for each 문을 좋아해서.. 

    class Solution {
        boolean solution(String s) {
            int p_num = 0, y_num = 0;
            for (String each : s.split("")) {
                if (each.equals("p") || each.equals("P")) p_num++;
                else if (each.equals("y") || each.equals("Y")) y_num++;
            }
            return p_num == y_num;
        }
    }

     

    golang

    func solution(s string) bool {
    	var pNum, yNum int
    	for _, r := range s {
    		if r == 'p' || r == 'P' {
    			pNum++
    		} else if r == 'y' || r == 'Y' {
    			yNum++
    		}
    	}
    	return yNum == pNum
    }
    반응형
Designed by Tistory.