코딩 테스트/Level 1

13. 문자열 내 p와 y의 개수

컴닥 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
}
반응형