[프로그래머스 / Level 2] 영어 끝말잇기 (파이썬)

2022. 9. 24. 23:18·🎲 알고리즘 공부/프로그래머스

[문제]

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

  1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  4. 이전에 등장했던 단어는 사용할 수 없습니다.
  5. 한 글자인 단어는 인정되지 않습니다.

다음은 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
'🎲 알고리즘 공부/프로그래머스' 카테고리의 다른 글
  • [프로그래머스 / Level 2] 행렬의 곱셈 (파이썬)
  • [프로그래머스 / Level 2] 프린터 (파이썬)
  • [프로그래머스 / Level 2] 카펫 (파이썬)
  • [프로그래머스 / Level 2] 기능개발 (파이썬)
듬듬
듬듬
  • 듬듬
    두드림
    듬듬
  • 전체
    오늘
    어제
    • 분류 전체보기 (280)
      • 📑 신입일기 (35)
      • 🍪 Web (1)
        • angular (1)
        • JavaScript (0)
      • 🧩 Node.js 공부 (2)
      • 🎲 알고리즘 공부 (192)
        • 프로그래머스 (76)
        • 백준 (96)
        • 코드업 (19)
      • 🎨 Tistory Customizing (1)
      • 💌 일상 (12)
        • 일상 (5)
        • 기록 (7)
      • 📜 자격증 (2)
        • 정보처리기사 (2)
      • 📗 spring boot 공부 (9)
      • 학교 공부 (20)
        • ICT 개론 (14)
        • 리눅스 (6)
      • ChatGPT 랑 놀기 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    충무로
    nodejs
    정보처리기사
    행렬덧셈
    오버워치
    오블완
    스프링 부트
    컨텐더스
    50문답
    코린이
    폰켓몬
    티스토리챌린지
    codeup
    6월 목표
    til
    코테
    스프링부트
    신입일기
    연습문제
    일기
    파이썬
    백준
    코민이
    BOJ
    피보나치수
    카카오
    찬양추천
    코드업
    프로그래머스
    정처기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
듬듬
[프로그래머스 / Level 2] 영어 끝말잇기 (파이썬)
상단으로

티스토리툴바