[파이썬] D1. 영어 끝말잇기

장서영·2026년 7월 29일

알고리즘

목록 보기
7/11

영어 끝말잇기

made by ME

import math

def solution(n, words):
    answer = []
    num = len(words)

     for i in range(1, num):
        # 1) 단어가 잘못된 경우
        if words[i-1][-1] != words[i][0]:
            p = (i+1)%n if (i+1)%n else n
            w = math.ceil((i+1)/n)
            return [p,w]
        #2) 중복이 된 경우
        if words[i] in words[:i]:
            p = (i+1)%n if (i+1)%n else n
            w = math.ceil((i+1)/n)
            return [p,w]
       
    # 이도 저도 아닌 경우
    return [0,0]

Gemini 피드백
1) 중복 단어 검사의 시간 복잡도 개선 필요

  • 문제 상황: 리스트 슬라이싱과 in연산자는 매번 O(i) 시간을 소모함. 전체 반복문과 합쳐지면 최악의 경우 O(N^2) 시간 복잡도가 됨
  • 개선안: set 자료구조 사용하면 O(1)만에 중복 여부를 확인할 수 있어 전체 시간 복잡도를 O(N)으로 줄일 수 있음

2) 번호(p)와 차례(w) 계산식의 간결화

  • 문제 상황: math 모듈 불필요하게 사용, 복잡함...
  • 개선안: p는 (i%n)+1, w는 (i//n)+1로 간소화

3) 중복 코드 제거 (DRY: Don't Repeat Yourself 원칙)

  • 문제 상황: 불필요한 중복
  • 개선안: or연산자로 조건을 하나로 합치기

리팩토링 코드

def solution(n, words):
    #1. 이미 나온 단어를 추적하기 위한 Set (첫 번째 단어로 초기화)
    seen = {words[0]}
    
    for i in range(1, len(words)):
        word = words[i]
        prev_word = words[i-1]
        
        #2. 두 조건을 or 연산자로 연결 + 3. 중복되는 코드 한 번에
        if word[0] != prev_word[-1] or word in seen:
            # [탈락자 번호, 탈락자 차례]
            return [(i%n)+1, (i//n)+1]
        
        # 지나간 단어 추가
        seen.add(word)
        
    # 탈락자가 없는 경우
    return [0,0]
        
profile
하루살이 개발자

0개의 댓글