코딩테스트/프로그래머스

[프로그래머스][Level 2] 영어 끝말잇기

박소민 2022. 6. 15. 02:14
영어 끝말잇기
 

코딩테스트 연습 - 영어 끝말잇기

3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3] 5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]

programmers.co.kr

 

  • 내 풀이
    • 테스트케이스 19번만 실패
    1. 단어의 길이가 1인 경우
    2. 앞 단어의 끝말과 다른 단어로 시작할 경우
    3. 단어가 여러개인 경우
      • 첫번째 단어의 인덱스 i를 구해서 words[i+1:] 에서 두번째 단어 인덱스 d를 구한다
      • 두번째 단어의 순서값 i+d+2
  • 원인

→ 3번에서 개수가 여러개인 단어의 첫번째 단어가 1/2번 경우 보다 빠르고 두번째 단어가 1/2번 경우보다 늦은 경우에

1/2번 경우에 대한 답이 나와야 하는데 첫번째 단어가 나오자마자 3번의 경우로 답을 구하게 된다

#n=int(input())
#words=input().split()
import math

def solution(n, words):
    answer=[]
    if not words:
        return [0,0]
    
    last=words[0][0]
    for w in words:
        if len(w)<2:
            return [0,0]
            
        if w[0]!=last:
            j=words.index(w)+1
            if j%n==0:
                answer.append(n)
            else:
                answer.append(j%n)
            answer.append(math.ceil(j/n))
            break
            
        last=w[-1]
        if words.count(w)>1:
            i=words.index(w)
            d=words[i+1:].index(w)
            idx=i+d+2 #인덱스말고 순서값
            
            if idx%n==0:
                answer.append(n)
            else:
                answer.append(idx%n)
            answer.append(math.ceil(idx/n))
            break
    else:
        return [0,0]

    return answer

 

  • 내 풀이 - 성공!
    • enumerate() 함수 사용하여 인덱스와 값 한번에 호출
    • 앞에 나온 단어들을 저장해서 단어가 두번째 나오는 건지 확인
#n=int(input())
#words=input().split()
import math

def solution(n, words):
    answer=[]
    ex=[]
    
    last=words[0][0]
    for i,w in enumerate(words):
        if len(w)<2:
            return [0,0]
            
        if w[0]!=last:
            j=i+1
            if j%n==0:
                answer.append(n)
            else:
                answer.append(j%n)
            answer.append(math.ceil(j/n))
            break
        
        if w in ex:
            j=i+1 #인덱스말고 순서값
            
            if j%n==0:
                answer.append(n)
            else:
                answer.append(j%n)
            answer.append(math.ceil(j/n))
            break
            
        last=w[-1]
        ex.append(w)
        
    else:
        return [0,0]

    return answer

 

  • 다른 사람 풀이
    • 순서값 말고 인덱스로 했으면 범위 나눌 필요없이 return 가능
def solution(n, words):
    for p in range(1, len(words)):
        if words[p][0] != words[p-1][-1] or words[p] in words[:p]: return [(p%n)+1, (p//n)+1]
    else:
        return [0,0]