[파이썬] 프로그래머스 LV1 옹알이2

청수동햄주먹·2023년 4월 28일
0

파이썬코딩테스트

목록 보기
26/35

프로그래머스 옹알이 2

정처기 실기 때문에 코테공부를 다시 중단했다가 다시 시작하니 효율적인 방법이 떠오르지 않았다.. 어차피 4단어 뿐이라 그냥 노가다를 했다.

def solution(babbling):
  i = 0
  hit = 0
  cnt = 0
  former = '!'

  for word in babbling:
    length = len(word)
    while(cnt < 15):
      current = word[i]

      if len(word) <= 1:
        break
      if word == 'ay' or word == 'wo' :
        break
      if former == current:
        break
      if current== 'a': #aya
        i += 1
        if word[i] != 'y':
          break
        i += 1
        if word[i] != 'a':
          break
        i += 1
        former = 'a'
      elif current == 'w': #woo
        i += 1
        if word[i] != 'o':
          break
        i += 1
        if word[i] != 'o':
          break
        i += 1
        former = 'w'
      elif current == 'm':
        i += 1
        if word[i] != 'a':
          break
        i += 1
        former = 'm'
      elif current == 'y':
        i += 1
        if word[i] != 'e':
          break
        i+=1
        former = 'y'
      else:
        break

      if i >= length:
        break
      cnt += 1
      
    if i == length:
      hit += 1
    i = 0
    former = '!'
    cnt = 0
  return hit

while(cnt < 15): 인 이유는 단어를 붙인다고 했을 때 그 단어의 길이가 30까지이기 때문에 두글자 옹알이로는 최대 15개를 붙일 수 있기 때문.

조건들을 다 통과해서 와일문을 빠져나오면 i가 단어길이의 같게 되고 hit수를 하나 올려준다.
아니라면 사용했던 변수들 초기화만 진행

1,2번 문제에서 계속 통과를 못해서 질문했었는데
'm', 'y'라던지 한글자로 된 것과
'wo, 'ay'라던지 충족하지 못하는? 에러케이스들를 생각하지 못했기 때문 이었다

남의 풀이

def solution(babbling):
    answer = 0
    for i in babbling:
        for j in ['aya','ye','woo','ma']:
            if j*2 not in i:
                i=i.replace(j,' ')
        if len(i.strip())==0:
            answer +=1
    return answer

babbling 단어 한개 한개 i 분석시작
j 는 ['aya','ye','woo','ma'] 를 하나씩 돌면서
같은것이 반복되지 않는지 검사하고 통과하면 공백으로 그만큼을 바꿔둠
j룹을 나가서 i 룹에서 공백밖에 없는 것은 공백을 없애주고 len이 0이 된것만 카운트

그런데 밑의 성능 비교를 보면 상당히 무거운 코드이다..

def solution(babbling):
    count = 0

    for b in babbling:
        if "ayaaya" in b or "yeye" in b or "woowoo" in b or "mama" in b:
            continue    
        if not b.replace("aya", " ").replace("ye", " ").replace("woo", " ").replace("ma", " ").replace(" ", ""):
            count += 1

    return count

제일 좋은 성능을 보여준 코드. 메모리도 제일 적게쓰고 제일 빠르기도함.
싱글 룹만 있기 때문인 듯하다.
첫번째 if 똑같은 옹알이가 연속으로 반복되는 것을 거른다
두번째 if 첫번째 if를 통과했다면 할수 있는 옹알이를 공백으로 바꾸고 맨 마지막에 공백을 없앤다(길이가 0 인 조건으로 바꿔도 ok 그런데 그럼 성능이 좀나빠짐). 그렇게 할 수 있다면 count를 올림

| 테스트 1 〉 | 통과 (0.01ms, 10.2MB) | 통과 (0.02ms, 10.1MB) | 통과 (0.01ms, 10.1MB) |
| 테스트 2 〉 | 통과 (0.01ms, 10.3MB) | 통과 (0.01ms, 10.2MB) | 통과 (0.01ms, 10.3MB) |
| 테스트 3 〉 | 통과 (0.01ms, 10.1MB) | 통과 (0.02ms, 10MB) | 통과 (0.01ms, 10.2MB) |
| 테스트 4 〉 | 통과 (0.01ms, 10.3MB) | 통과 (0.01ms, 10.1MB) | 통과 (0.00ms, 10.2MB) |
| 테스트 5 〉 | 통과 (0.01ms, 10.3MB) | 통과 (0.01ms, 10.1MB) | 통과 (0.00ms, 10.1MB) |
| 테스트 6 〉 | 통과 (0.01ms, 10.3MB) | 통과 (0.01ms, 10.2MB) | 통과 (0.01ms, 9.92MB) |
| 테스트 7 〉 | 통과 (0.01ms, 10.2MB) | 통과 (0.01ms, 10.2MB) | 통과 (0.00ms, 10.1MB) |
| 테스트 8 〉 | 통과 (0.01ms, 10.2MB) | 통과 (0.01ms, 10.4MB) | 통과 (0.00ms, 10.2MB) |
| 테스트 9 〉 | 통과 (0.01ms, 10.2MB) | 통과 (0.02ms, 10.2MB) | 통과 (0.01ms, 10.1MB) |
| 테스트 10 〉 | 통과 (0.01ms, 10.3MB) | 통과 (0.01ms, 10.1MB) | 통과 (0.01ms, 10.1MB) |
| 테스트 11 〉 | 통과 (0.02ms, 10.1MB) | 통과 (0.02ms, 10.1MB) | 통과 (0.01ms, 10.3MB) |
| 테스트 12 〉 | 통과 (0.07ms, 10.2MB) | 통과 (0.15ms, 10.1MB) | 통과 (0.03ms, 10.1MB) |
| 테스트 13 〉 | 통과 (0.07ms, 10.2MB) | 통과 (0.15ms, 10.2MB) | 통과 (0.07ms, 10.2MB) |
| 테스트 14 〉 | 통과 (0.10ms, 10.3MB) | 통과 (0.17ms, 10MB) | 통과 (0.06ms, 9.96MB) |
| 테스트 15 〉 | 통과 (0.05ms, 10.1MB) | 통과 (0.12ms, 10.1MB) | 통과 (0.02ms, 10.3MB) |
| 테스트 16 〉 | 통과 (0.04ms, 10.3MB) | 통과 (0.18ms, 10.1MB) | 통과 (0.07ms, 10.3MB) |
| 테스트 17 〉 | 통과 (0.18ms, 10.3MB) | 통과 (0.14ms, 10.2MB) | 통과 (0.04ms, 9.95MB) |
| 테스트 18 〉 | 통과 (0.05ms, 10.3MB) | 통과 (0.08ms, 10.3MB) | 통과 (0.01ms, 9.98MB) |
| 테스트 19 〉 | 통과 (0.01ms, 10.3MB) | 통과 (0.03ms, 10MB) | 통과 (0.02ms, 9.89MB) |
| 테스트 20 〉 | 통과 (0.05ms, 10.4MB) | 통과 (0.06ms, 10.2MB) | 통과 (0.05ms, 10.3MB) |
profile
코딩과 사별까지

0개의 댓글