코테 노트/프로그래머스

Level 2 영어 끝말잇기 Python3

화요밍 2021. 1. 29. 21:25
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/12981?language=python3

 

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

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

 

최종 코드

 

hwayeon351/Programmers-Algorithms

프로그래머스 코딩테스트 풀이. Contribute to hwayeon351/Programmers-Algorithms development by creating an account on GitHub.

github.com

def solution(n, words):
    cnt = 0
    last = ""
    book = []
    for i in range(len(words)):
        person = i % n + 1
        word = words[i]
        if person == 1: cnt += 1
        if i == 0: 
            last = word
            book.append(word)
            continue
        if last[-1] != word[0] or word in book: return [person, cnt]
        last = word
        book.append(word)
        
    return [0, 0]

 


풀이 과정

풀이 시간  13분

1. 변수 선언

 먼저, 차례를 저장하는 cnt를 선언하고 0으로 초기화 합니다. 그리고 앞사람이 말한 단어를 저장할 last를 선언합니다.

이전에 등장했던 단어를 사용하지 못하는 끝말잇기의 규칙을 위해 리스트에 등장했던 단어들을 담도록 book = []을 선언합니다.

 

 

2. 끝말 잇기

    for i in range(len(words)):
        person = i % n + 1
        word = words[i]
        if person == 1: cnt += 1
        if i == 0: 
            last = word
            book.append(word)
            continue
        if last[-1] != word[0] or word in book: return [person, cnt]
        last = word
        book.append(word)

 for문을 통해 입력인 words의 길이 만큼 아래의 과정을 반복합니다. 과정에 들어가기에 앞서 간단한 설명을 하자면, person이라는 변수는 끝말잇기에 참여하는 사람의 번호입니다. 매 반복마다 person = i % n + 1로 초기화 되는데, 이는 입력 words가 끝말잇기에 참여하는 사람들이 순서대로 말한 단어들이기 때문에, 만약 n = 5라면 i % n + 1을 하면 1, 2, 3, 4, 5의 값이 반복될 것 입니다. 이해됐다면 아래 과정을 살펴봅시다.

  1. i % n + 1 = person, word = words[i]로 초기화 한다.
  2. 만약, i == 0인 경우, 즉 끝말잇기의 첫 단어인 경우에는 last = word로 초기화하고, book에 word를 append 한 후 continue한다.
  3. last의 마지막 문자가 word의 첫문자가 아닌 경우(앞 사람이 말한 단어의 끝말잇기가 아닌 경우), word가 book 안에 있는 경우(이전에 말했던 단어와 중복인 경우), 해당 사람이 탈락이므로 return [person, cnt]를 해준다.
  4. 해당 번호의 사람이 끝말잇기에 성공한 경우, last = word로 초기화 하고 book에 word를 append 해 준다.

 만약, 모두가 끝말있기에 성공하여 탈락자가 생기지 않으면, for문이 len(words)만큼 반복될 것이다. 이 경우 for문 밖에 return [0, 0]이 실행된다.

 

 


다른 사람의 풀이

def solution(n, words):
    for i in range(1, len(words)):
        if words[i][0] != words[i-1][-1] or words[i] in words[:i]: return [i % n + 1, i // n + 1]

    return [0, 0]

 위 코드는 다른 사람의 풀이를 참고하여 다시 작성한 코드이다. 사실상 위에서 내가 작성한 코드와 같은 원리를 사용했지만, 훨씬 간결하다.

따로 person, last, word, cnt, book을 선언하고 계속해서 초기화하지 않아도 입력인 words를 적절히 활용해서 원하는 값을 도출할 수 있어서 훨씬 효율적인 것 같다.

728x90
반응형