나의 답안 - 시간 초과

def solution(n,a,b):
    answer = 1
    data = [i for i in range(1, n + 1)]
    
    while True:
        tmp = []
        
        for i in range(0, len(data), 2):
            if data[i] == a and data[i + 1] == b:
                return answer
            if data[i] in [a, b]:
                tmp.append(data[i])
            elif data[i + 1] in [a, b]:
                tmp.append(data[i + 1])
            else:
                tmp.append(-1)
                
        data = tmp
        answer += 1

 

답안 예시

def solution(n,a,b):
    answer = 0
    while a != b:
        answer += 1
        a, b = (a + 1) // 2, (b + 1) // 2
    return answer

 

나의 코드

from math import gcd

def solution(arr):
    answer = arr[0]
    for i in arr:
        answer = answer * i // gcd(answer, i)
    return answer

 

gcd 함수는 일반적으로 사용 가능하나

최소공배수 lcm 함수는 파이썬 3.9 이상 버전에서만 지원하기에 코딩테스트를 보는 환경에 따라 다를 수 있음을 확인하여야 한다.

 

3.9 미만 버전에서 lcm을 구하려면 gcd 공식을 활용하여 함수로 풀이하자.

 

- a * b = GCD * LCM

- LCM = a * b / gcd

나의 코드

def solution(n, words):
    answer = [words[0]]
    x, y = 1, 1
    for i in range(1, len(words)):
        x += 1
        if x == n + 1:
            x, y = 1, y + 1

        if words[i] in answer:
            return [x, y]
        elif answer[-1][-1] != words[i][0]:
            return [x, y]
        else:
            answer.append(words[i])

    return [0, 0]

결과 인덱스를 x, y로 따로 연산해줬는데 그냥 나눠서 바로 구할 수 있었다.

 

 

효율 코드

return [(p%n)+1, (p//n)+1]

나의 코드

def solution(s):
    data = []
    for i in s:        
        if len(data) == 0:
            data.append(i)

        elif data[-1] == i:
            data.pop()

        else:
            data.append(i)

    return 1 if len(data) == 0 else 0

 

while, replace를 활용하면 1억~10억이 넘는 경우의 수로 시간 초과가 뜰 것.

 

스택을 이용하여 괄호 검사와 같은 맥락으로 접근해보자,

+ Recent posts