본문 바로가기
코딩 테스트/프로그래머스

[프로그래머스 - Python] Lv.2 영어 끝말잇기

by 오엥?은 2023. 3. 12.
반응형
  • 문제

https://school.programmers.co.kr/learn/courses/30/lessons/12981

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 풀이
def solution(n, words):

    li = [words[0]]

    for x in range(0, len(words) - 1):
        li.append(words[x + 1])
        se = set(li)

        if (words[x].strip()[-1] != words[x + 1].strip()[0]) | (len(li) != len(se)):
            # 끝말을 잇지 않았을 때 or 중복된 단어일 때
            num1 = (x + 2) % n
            if num1 == 0:
                num1 = n

            if num1 == n:
                num2 = int((x + 2) / n)
            else:
                num2 = int((x + 2) / n) + 1
            return [num1, num2]

    return [0, 0]

배열 words을 반복문 돌린다.

그 전에 li = [words[0]]을 선언하고 시작한 이유는 반복문 안에서 li.append(words[x + 1]) 을 하는데 이러면 0번째 요소는 들어갈 수가 없다. 근데 0번째는 무조건 잘못될 수가 없기 때문에 그냥 때려넣고 시작해도 상관이 없다.

 

li 에는 x + 1번째 요소들을 차례로 넣고 se은 그 li를 set로 변환한 형태다. set는 중복된 요소를 지워버리기 때문에 만약 둘의 길이가 달라지면 그 놈은 중복된 단어를 말한 거라서 탈락이다.

len(li) != len(se)

 

그리고 x 번째 글자의 끝 글자와 x + 1 번째 글자의 첫 글자가 다른지 확인하는 방법은 이거다.

words[x].strip()[-1] != words[x + 1].strip()[0]

a.strip()[-1] 을 하면 a라는 문자열의 마지막 글자를 알 수 있다.

 

끝말을 잇지 않았을 경우와 중복된 단어를 말한 경우 모두 탈락조건이기 때문에 or( | )을 사용하여 조건을 걸어준다.

if (words[x].strip()[-1] != words[x + 1].strip()[0]) | (len(li) != len(se)):

 

 

만약 세 번째 사람이 자신의 세 번째 차례에서 틀렸다면 [3, 3] 이런 식으로 최종출력이 되어야 한다.

위 if 조건에 걸리는 x 는 사실 x + 1 이 잘못됐기 때문에 걸리는 거다. 근데 배열의 index 는 0부터 시작하기 때문에 거기다가 또 +1 을 해줘야 한다. 그래서 최종적으로는 x + 2 번째 단어가 문제가 되는 것이다.

 

return 되어야 하는 배열 중 0 번째 요소는 참여한 n명의 사람 중 누가 탈락자인지 판별하는 요소이다. 그래서 잘못된 단어의 순서 / 인원 수의 나머지 즉, (x + 2) % n가 된다. 근데 이게 0이 되면 맨 마지막 사람이라는 뜻이다. 그래서 num1(탈락자)이 0이면 num1 = n 이라고 했다. 

 

return 되어야 하는 배열 중 1 번째 요소는 탈락자가 몇 번째로 말한 단어인지 판별하는 요소이다. num1이 0이면 위에서 n으로 바꿔주었다. 그래서 num1 = n 이면 int((x + 2) / n) 번째다. 근데 num1 이 0이 아니면 int((x + 2) / n) + 1을 해야한다. 페이징이랑 똑같다. 

x + 2(탈락 단어의 순서)가 7, 8, 9일 때를 예로 들고, 참가자가 3명이라고 한다면 

1번 참가자 : 1, 4, 7, ...

2번 참가자 : 2, 5, 8, ...

3번 참가자 : 3, 6, 9, ...

 

탈락 단어의 순서가 7일 때 : 1번 참가자의 3 번째 단어 -> [1, 3] ( int(7 / 3) = 2, 2 + 1 = 3 번째 단어 )

탈락 단어의 순서가 8일 때 : 2번 참가자의 3 번째 단어 -> [2, 3] ( int(8 / 3) = 2, 2 + 1 = 3 번째 단어 )

탈락 단어의 순서가 9일 때 : 3번 참가자의 3 번째 단어 -> [3, 3] ( int(9 / 3) = 3 번째 단어 )

 

 

만약 반복문 안에서 위 조건들에 걸리지 않았다면 탈락자가 없다는 얘기이다.

  • 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

문제에서 이렇게 주어졌기 때문에 [0, 0]을 return 하면 된다.

반응형