본문 바로가기

알고리즘풀이/프로그래머스

[Lv2.] 영어 끝말잇기

👉 사용 언어 : PYTHON3

영어 끝말잇기

✅ Solution

import math

def solution(n, words):
    ans = []
    temp = []
    for i in range(len(words)):
        if len(temp) > 0 and temp[-1][-1] != words[i][0] or words[i] in temp:
            break
        temp.append(words[i])
    if len(temp) == len(words):
        return [0,0]
    else:
        if (len(temp)+1) % n == 0:
            ans.append(n)
        else:
            ans.append((len(temp)+1) % n)
        ans.append(math.ceil((len(temp)+1) / n))
        return ans

 

👉 문제 설명 및 제한 사항

  • 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기 진행중
  • 규칙
    • 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. 
    • 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. 
    • 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. 
    • 이전에 등장했던 단어는 사용할 수 없습니다. 
    • 한 글자인 단어는 인정되지 않습니다.
  • 예시
    • tankkickknowwheellanddreammotherrobot → tank
    • 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락❗️
  • 매개변수
    • 사람의 수 n
      • 2 <= n <= 10 자연수
    • 사람들이 순서대로 말한 단어 words 
      • n <= 배열 길이 <= 100
      • 2 <= 단어(원소) 길이 <= 50
      • 모든 단어는 알파벳 소문자 로만❗️
  • 리턴값
    • [가장 먼저 탈락하는 사람의 번호, 그 사람이 자신의 몇 번째 차례 에 탈락하는지]
    • 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]

👉 아이디어

  • temp 배열을 하나 생성한다.
  • words 배열을 순회하며 현재 원소(단어)의 맨 앞 문자와 temp 배열 맨 끝 단어의 맨 끝 문자를 비교한다.
    • 비교한 문자가 같지 않거나 이미 temp 배열에 있는 단어라면 반복문을 종료한다.
    • 그렇지 않으면 temp 배열에 현재 단어를 추가하고 계속 순회해나간다.
  • temp 배열의 길이에 따라 값을 리턴한다.
    • temp 배열 길이 == word 배열 길이 : 탈락자가 생기지 않으므로 [0, 0]
    • temp 배열 길이 != word 배열 길이
      • temp 배열 : 탈락자 전 순서의 단어까지만 들어있기 때문에 +1을 한 후, 계산한다.
      • 번호 : (temp 배열 길이 + 1) % n ( 이 값이 0이면 n )
      • 차례 : (temp 배열 길이 + 1) / n 올림값

 

 다른 사람 풀이 참고

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]

 

👉 깨달은 것 / 알게된 것

  • 시간복잡도를 고려하여 문자열 슬라이싱이 아닌 보조배열을 생성하여 pop, append 하는 방법을 택했는데 결과적으로 크게 차이가 없다.
  • (len(temp)+1) % n 로 풀이하면 나머지가 0 일 경우를 또다른 조건으로 체크해줘야 하는데 +1 나머지 연산 후, 실행하면 따로 조건을 나눌 필요가 없어진다.
  • 차례를 구할 때도 마찬가지로 +1 // 연산 후, 실행함으로써 내장 함수 ceil을 사용할 필요가 없어진다.
  • else: return을 if문과 동일한 들여쓰기에서 사용하지 않아도 가능하다❗️

'알고리즘풀이 > 프로그래머스' 카테고리의 다른 글

[Lv2.] 모음사전  (0) 2024.03.01
[Lv2.] 프로세스  (0) 2024.03.01
[Lv2.] 짝지어 제거하기  (0) 2024.02.28
[2/22] 기출문제 풀이  (0) 2024.02.20
[PCCE 기출문제 풀이] 10번 / 데이터 분석  (0) 2024.02.18