[프로그래머스/Lv2] 영어 끝말잇기
문제
n명의 사람들이 순서대로 끝말잇기 놀이를 한다.
영어 끝말잇기의 규칙은 다음과 같다.
1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말한다.
2. 마지막 사람이 말한 다음에는 다시 1번부터 시작한다.
3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 한다.
4. 이전에 나왔던 단어는 말할 수 없다.
5. 한 글자인 단어는 말할 수 없다.
사람의 수 n과 사람들이 순서대로 말한 words가 매개변수로 주어질 때,
가장 먼저 탈락한 사람의 번호와 그 사람이 몇 번째 차례에 탈락하는지를 반환하는 함수를 만들어야 한다.
제한조건
1. 끝말잇기에 참여하는 사람의 수는 2 이상 10 이하의 자연수이다.
2. words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하이다.
3. 단어의 길이는 2 이상 50 이하이다.
4. 모든 단어는 알파벳 소문자로만 이루어져 있다.
5. 끝말잇기에 사용되는 단어의 뜻은 신경 쓰지 않아도 된다.
6. 정답은 [번호, 차례] 형태로 return해야 한다.
7. 만약 주어진 단어들로 탈락자가 생기지 않는다면 [0, 0]을 return한다.
코드
import math
def solution(n, words):
word_dict = {}
dropout_num = 0
dropout_order = 0
for i in range(len(words)):
if len(words[i]) < 2:
dropout_num = (i%n) + 1
dropout_order = (i+1) / n
return [int(dropout_num), math.ceil(dropout_order)]
try:
word_dict[words[i]] += 1
dropout_num = (i%n) + 1
dropout_order = (i+1) / n
return [int(dropout_num), math.ceil(dropout_order)]
except:
word_dict[words[i]] = 0
if i > 0:
if words[i][0] != words[i-1][-1]:
dropout_num = (i%n) + 1
dropout_order = (i+1) / n
return [int(dropout_num), math.ceil(dropout_order)]
return [dropout_num, dropout_order]
설명
word_dict = {}
dropout_num = 0
dropout_order = 0
word_dict은 이전에 나온 단어인지를 판별할 때 사용한다.
dropout_num은 탈락한 사람의 번호를 의미한다.
dropout_order는 탈락한 사람의 차례를 의미한다.
탈락자가 없을 때를 생각해서 0으로 초기화해 둔다.
dropout_num과 dropout_order는 끝말잇기 조건에 맞지 않는 단어의 위치(words의 인덱스)를 찾아
그 인덱스에서 각각 n을 모듈러 연산하여 1을 더한 값, 1을 더한 뒤 n으로 나눈 값이 된다.
for i in range(len(words)):
if len(words[i]) < 2:
dropout_num = (i%n) + 1
dropout_order = (i+1) / n
return [int(dropout_num), math.ceil(dropout_order)]
한 글자를 말했을 경우에 동작한다.
try:
word_dict[words[i]] += 1
dropout_num = (i%n) + 1
dropout_order = (i+1) / n
return [int(dropout_num), math.ceil(dropout_order)]
except:
word_dict[words[i]] = 0
이전에 나온 단어를 말했을 경우에 동작한다.
파이썬의 딕셔너리는 존재하지 않는 키에 대한 값을 연산하려 하면 오류가 발생한다.
try, except 문을 활용해서 이 오류가 발생하면 어떠한 동작을 하도록 설정한다.
word_dict에 현재 인덱스의 단어를 키로 하는 값에 1을 더한다.
이 때 해당하는 키가 없다면 오류가 발생하여 except로 넘어간다.
except에서는 word_dict에 현재 인덱스의 단어를 키로 갖는 값을 저장한다.
해당하는 키가 있다면 이전에 나왔던 단어임을 의미하기 때문에
탈락자의 번호와 차례를 반환해준다.
if i > 0:
if words[i][0] != words[i-1][-1]:
dropout_num = (i%n) + 1
dropout_order = (i+1) / n
return [int(dropout_num), math.ceil(dropout_order)]
이전 단어의 마지막 문자와 현재 단어의 첫번째 문자가 같지 않을 경우에 동작한다.
words 배열의 첫번째 단어는 검사할 필요가 없기 때문에 i가 0보다 클 경우에 동작하도록 한다.
return [dropout_num, dropout_order]
위 끝말잇기 조건들을 모두 통과했다면 탈락자가 없기 때문에
0으로 초기화 된 dropout_num과 dropout_order를 반환한다.
'코딩테스트 > 연습문제' 카테고리의 다른 글
[프로그래머스/Lv2] N개의 최소공배수 (0) | 2022.10.19 |
---|---|
[프로그래머스/Lv2] 구명보트 (0) | 2022.10.18 |
[프로그래머스/Lv2] 짝지어 제거하기 (0) | 2022.10.18 |
[프로그래머스/Lv2] 카펫 (0) | 2022.10.14 |
[프로그래머스/Lv2] 다음 큰 숫자 (0) | 2022.10.13 |