[문제]
1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
- 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
- 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
- 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
- 이전에 등장했던 단어는 사용할 수 없습니다.
- 한 글자인 단어는 인정되지 않습니다.
다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.
tank → kick → know → wheel → land → dream → mother → robot → tank
위 끝말잇기는 다음과 같이 진행됩니다.
- 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
- 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
- 3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
- 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
- (계속 진행)
끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.
사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/12981
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🎨 풀이
💡 전체 코드
def solution(n, words):
answer = []
tmp = []
for i in range(len(words)):
# 1. 단어끼리 제대로 이어지는 지 확인.
if i != 0 :
if words[i][0] != words[i - 1][len(words[i - 1]) - 1]:
if (i + 1) % n == 0:
answer = [n, (i + 1) // n]
else:
answer = [(i + 1) % n, ((i + 1) // n) + 1]
break
# 2. 같은 단어가 있는 지 확인.
if words.count(words[i]) > 1:
if words[i] in tmp:
if (i + 1) % n == 0:
answer = [n, (i + 1) // n]
else:
answer = [(i + 1) % n, ((i + 1) // n) + 1]
break
else:
tmp.append(words[i])
if answer == []:
answer = [0, 0]
return answer
> 핵심 : 숫자 하나를 기준으로 잡고, 쭉 더해준 후 비교하기
🍦 코드 설명 (실행 순서대로 나열)
#solution
answer = []
tmp = []
1. 리스트를 초기화한다.
- answer : 정답 (리스트)
- tmp : 중복 체크를 위한 임시 보관 리스트
#solution - 단어끼리 이어지는지, 같은 단어가 있는지 둘 다 확인한다!
for i in range(len(words)):
# 1. 단어끼리 제대로 이어지는 지 확인.
if i != 0 :
if words[i][0] != words[i - 1][len(words[i - 1]) - 1]:
if (i + 1) % n == 0:
answer = [n, (i + 1) // n]
else:
answer = [(i + 1) % n, ((i + 1) // n) + 1]
break
# 2. 같은 단어가 있는 지 확인.
if words.count(words[i]) > 1:
if words[i] in tmp:
if (i + 1) % n == 0:
answer = [n, (i + 1) // n]
else:
answer = [(i + 1) % n, ((i + 1) // n) + 1]
break
else:
tmp.append(words[i])
# 단어 이어지는 지 확인
2. words[i][0]과 words[i-1][len(words[i-1])-1]을 비교한다.
= 해당 단어의 첫 글자와 그 전 단어의 맨 끝 글자를 비교한다.
3. 만약 그 전 글자와 현재 글자가 이어지지 않는다면, i+1이 n으로 나누어떨어지는 지 확인한다.
4. 나누어떨어진다면, answer에 [n, (i+1) // n] 을 넣어준다.
- 밑에와 같이 처리를 한다면 여기에 0,0이 들어가는 불상사가 생길 수 있다. 그래서 경우를 나눠준 것이다.
5. 나누어떨어지지 않는다면, answer에 [(i + 1) % n, ((i + 1) // n) + 1] 을 넣어준다.
6. 이어지지 않는 걸 확인했고, answer에 값도 넣었으니 for문을 break 해준다.
# 해당 단어가 중복인지 확인
7. 만약 count 했을 때 1보다 더 큰 수가 나온다면 7번 ~ 을 반복한다.
8. 만약 tmp에 words[i]가 이미 있다면, 4번~5번 작업을 똑같이 반복해준다.
9. 중복인 걸 확인도 했고, answer에 값도 넣었으니 for문을 break 한다.
10. tmp에 words[i]는 없는 상태라면, 우선 추가해준 후 넘어간다.
if answer == []:
answer = [0, 0]
return answer
11. 만약 answer이 텅텅 비어있다면, answer에 [0,0]을 넣는다.
12. answer을 return한다.

끝~
⭐ 느낀점
> 이 문제,, 처음에는 쉽게 풀 줄 알았으나. . . 뭔가 자꾸 꼬여서 계속 수정을 했다. ㅠㅠ answer에 값 넣는 것부터 만만하지는 않더라. 하하. 그래도 요정도면 잘 푼 것 같다. if문이 좀 많긴 하지만..~^^ 잘 풀었다. 고생 많았다! 아 그리고 실행 순서의 중요성을 좀 느낀 것 같다. (처음에는 for문을 분리해서 진행했었는데 오류가 잔뜩 나더라!)
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 2] 행렬의 곱셈 (파이썬) (0) | 2022.09.28 |
---|---|
[프로그래머스 / Level 2] 프린터 (파이썬) (0) | 2022.09.26 |
[프로그래머스 / Level 2] 카펫 (파이썬) (0) | 2022.09.23 |
[프로그래머스 / Level 2] 기능개발 (파이썬) (0) | 2022.09.22 |
[프로그래머스 / Level 2] JadenCase 문자열 만들기 (파이썬) (0) | 2022.09.22 |