본문 바로가기

코딩

[파이썬] 코딩테스트 연습 - 옹알이 (1), 옹알이 (2) 코드 해설

반응형

 

여러분 그거 아십니까? 옹알이 (2)의 코드를 옹알이 (1) 문제에 제출해도 통과가 되는데 그 반대는 안됩니다.

아래는 일단 옹알이 (1)의 문제 코드에요

 

프로그래머스 코딩테스트 연습 옹알이 (1) 문제

 

프로그래머스 코딩테스트 연습 옹알이 (1) 문제

 

각 문자열에서 단어는 각각 최대 한 번씩만 등장하는 것으로 주어지며, 네 가지 단어를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없도록 코드를 작성하는 것이 옹알이 (1) 문제의 포인트였다.

 

#옹알이(1)

def solution(babbling):
    answer = 0
    for i in babbling:
        j = 0
        while j < len(i):
            if i[j:j+2] == 'ye' or i[j:j+2] == 'ma':
                j += 2
                if j == len(i) or i[j:j+2] == 'ye' or i[j:j+2] == 'ma'\
                or i[j:j+3] == 'aya' or i[j:j+3] == 'woo':
                    if j == len(i):
                        answer += 1
                        break
                    else:
                        continue
                else:
                    break
            elif i[j:j+3] == 'aya' or i[j:j+3] == 'woo':
                j += 3
                if j == len(i) or i[j:j+2] == 'ye' or i[j:j+2] == 'ma'\
                or i[j:j+3] == 'aya' or i[j:j+3] == 'woo':
                    if j == len(i):
                        answer += 1
                        break
                    else:
                        continue
                else:
                    break
            else:
                break
    return answer

 

문자열을 슬라이싱해서 확인을 하고 확인한 만큼 인덱스를 추가해주면서 조건에 맞는 지 if안에 if안에 if를 넣으면서 조건을 만족하면 break로 나오도록 해서 3중으로 감싸져 있더라도 문자열 인덱스 확인 과정을 최대한 빨리 끝낼 수 있도록 코드를 짜봤다.

 

그리고 이 밑에 있는 건 옹알이 (2)의 코드입니다

 

프로그래머스 코딩테스트 연습 옹알이 (2) 문제

 

프로그래머스 코딩테스트 연습 옹알이 (2) 문제

 

연속해서 같은 단어가 나오지 않으면서, 네 가지 단어만으로 이루어진 문장을 통과시키는 것이 포인트다.

 

#옹알이 (2)
def solution(babbling):
    answer = 0
    for i in range(len(babbling)):
        if 'ayaaya' in babbling[i] or 'yeye' in babbling[i] \
        or 'woowoo' in babbling[i] or 'mama' in babbling[i]:
            continue
        for j in ['aya', 'ye', 'woo', 'ma']:
            babbling[i]=babbling[i].replace(j,'1')
        if babbling[i].isdigit():
            answer+=1
    return answer

 

반응형

 

연속해서 같은 단어가 나오는 지 확인하는 것?

우선 두 번 이상 반복되는 단어가 babbling[i]에 있는 지 확인하고 두 번 이상 반복되는 단어를 거르게 continue로 넘긴 다음에,

aya, ye, woo, ma가 babbling[i]안에 있다면 그걸 전부 숫자 1로 변환한 뒤에,

그게 다 숫자이면 aya ye woo ma로만 이루어진 babbling[i]이었던 것이니까 answer에 하나씩 더해주는 코드다.

 

자 이제 왜 옹알이 (1)에 옹알이 (2)의 코드를 넣어도 통과가 되는 지 확인해보자.

 

옹알이(1) 코드

 

옹알이(1)과 (2) 모두 aya ye ma woo 로만 이루어진 단어여야 하도록 코드를 작성하였다는 공통점이 있다.

그런데 옹알이 (1)에서 주어지는 babbling은 aya, ye, ma, woo 중 단어가 한 번만 등장한다.

나는 옹알이 (2)에 제출한 코드의 조건으로 일단 옹알이 (1)처럼 aya, ye, ma, woo로만 이루어진 단어만 등장하도록 하면서, 연속해서 같은 단어가 나타나지 않도록 작성하였기 때문에 옹알이 (1)에 옹알이 (2)의 코드가 통과가 되는 것이다.

 

예를 들면,

옹알이(2)의 코드는 aya ye aya는 가능하지만 aya aya ye는 통과될 수 없도록 작성한 코드이다.

옹알이(1)의 문제는 aya ye aya가 등장하지 않는다. aya aya ye 또한 등장하지 않는다. 문제 조건 자체가 한 번만 등장한다고 했기 때문이다.

그러므로 옹알이(1)과 (2)의 공통된 조건인 'aya ye ma woo'로만 이루어진 단어여야 한다는 점은 만족하고,

옹알이(1)에서 제공하는 문자열 자체가 'aya ye ma woo'가 한 번만 등장하기 때문에,

옹알이(2)에서 'aya ye ma woo'들이 중복해서 등장할 것을 제거하는 코드 자체가 옹알이 (1)에서는 있으나 없으나 전혀 상관이 없어서,

통과하는 것이다.

 

반대로 옹알이(1)의 코드를 옹알이(2)의 코드에 넣는 것은 불가능하다.

 

옹알이(2) 코드

 

필요충분조건이 생각나는 문제였다.

 

개인적으로 옹알이 (2)가 더 쉬워서 옹알이 (1)을 푸는 데 꽤 오랜 시간이 걸렸는데, 사람들의 정답률을 보면 옹알이 (1)이 확실히 옹알이 (2)보다 어려운 것 같다.

허무하겠지만 결론은 옹알이(2)를 풀었다면 옹알이(1)에 그냥 옹알이(2)코드를 넣어보십시오.

반응형