/ ALGORITHM

(프로그래머스 with python) 영어 끝말잇기


Level2 - 영어 끝말잇기

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


내 풀이

  • 단어의 앞뒤값을 비교해 같으면 2개를 배열에 담아준다
  • 만약 앞뒤값이 같지 않을때의 조건을 구한다
  • 만약 배열에 비교하는 단어가 들어가 있을때의 조건을 구한다

위의 3가지 정도를 생각하고 코드를 짜기 시작했다. 이후에 내가 짠 코드를 설명하려고 했을때 나도 이해할 수 없었다…

  • 단어를 기준으로 for문을 돌리며 현재 단어의 앞의 문자와 이전 문자의 끝 문자가 같은지 다르지 비교했다
  • 만약 문자가 같다면 현재 단어가 새로운 배열 a에 존재하는지 비교했다
  • 만약 a배열에 담겨있다면 해당 단어의 index값을 구했다.
  • 만약 담겨 있지 않다면 이전값과 현재값의 단어를 dic에 담아주었다
  • ….

벌써부터 내가 왜 이렇게 풀었는지 이해 할 수 없었다.. 😂


# 잘못된 풀이

def solution(n, words):
    arr = []
    a = {}
    length = len(words)//n
    for i in range(1, len(words)):
        if words[i - 1][-1] == words[i][0]:
            if words[i] in a:
                print('arr배열에 이미 단어 존재',words[i])
                index = words.index(words[i])
                break
            else:
                a[words[i - 1]] = 1
                a[words[i]] = 1
        else:
            print('값이 다른 단어 존재', words[i])
            index = words.index(words[i])
            print(index)
            cnt = 0
            for i in range(1, length + 1):
                w = words[:].pop()
                cnt += 1
                if w == words[index]:
                    print(cnt, i)
            break
         
    return [0, 0]
    
solution(2, ["hello", "one", "even", "never", "now", "world", "draw"])



다른 사람 풀이

결국 다른 사람들의 코드를 참고하였다. 여러 코드를 보고 앞뒤 단어가 다르거나 중복되는 단어가 존재할 경우 단어의 순서와 사람 번호를 어떻게 업데이트 해줄거냐 이 부분을 생각해 낸다면 쉽게 풀리는 문제였을 것 같다. 나의 문제는 왜 몫과 나머지를 사용해야 하는지 답을 보고도 그 이유를 제대로 이해하지 못했다.. (나 진짜 빡대가ㄹ.,ㅣ 인가보다 ㅠㅠㅠ)

  1. 무조건 첫 단어는 배열에 담기는 단어이기 때문에 arr.append(words[0]) 배열에 담아준다
  2. 이후 단어를 기준으로 for문을 돌리며 단어의 앞뒤 문자가 같거나 arr배열에 현재 단어가 포함되어 있지 않으면 arr에 단어를 담아준다
  3. 2번의 조건에 하나라도 위배되면 number(단어의 번호)order(차례) 을 새롭게 업데이트 해준다
def solution(n, words):
    arr = []
    number, order = 0,0
    arr.append(words[0])
    for i in range(1, len(words)):
        if words[i] not in arr and words[i - 1][-1] == words[i][0]:
            arr.append(words[i])
        else:
            number = (i % n) + 1 # 
            order = (i // n) + 1 # 몇번째 차례인가
            break
    return [number, order]

solution(3, ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"])

단어는 n번의 사람이 한번씩 돌아가면서 말하는 규칙이 있다. 1번 -> 2번 -> 3번 -> 1번 -> 2번…

[“hello”, “one”, “even”, “never”, “now”, “world”] 이 word의 배열로 예를 들어보자. 4번 인덱스에 있는 now라는 단어가 규칙에 위반된다. 그렇다면 이 단어는 몇번째 사람이 몇번째 번호로 불렀을까 ..? (몰랑..ㅠㅠ)

order = (i // n) + 1
i = 4일때 now라는 단어의 차례를 구하기 위해서 now인덱스를 사람의 수 n으로 나누어 1을 더해준다(1을 더하는 이유는 배열은 0부터이기 때문) 인덱스가 4인 경우 4//2 = 2 , 2 + 1 = 3해서 3번째의 차례에 now가 등장한다
2명의 사람이 총 3번을 번갈아가면서 단어를 말했고 그때 nows는 3번째 차례때 불린다 [“hello”, “one”] ,[“even”, “never”] ,[“now”, “world”]

number = (i % n) + 1
2사람을 1, 2로 생각하면 좀 헷갈린다. 0, 1이라고 생각하고 마지막에 1을 더해주자
그렇다면 i = 4일때 now라는 단어는 몇 번 사람이 부르는지 생각해보자
나눠 갖는다고 생각해보면 4개를 2명이 나누어 가질때 4 % 2를 한다. 2사람이 공평하게 나누어가졌고 마지막 4번째에 있는 값은 0번호를 갖는 사람이 가지게 된다
4 % 2 + 1 = 1번째 사람이 갖게 된다



사람들이 꽤 풀만하다고 하는 문제는 난 다 어렵다.. 도대체 왜인가
알고리즘 ,,, 왜 풀면 풀수록 어려워지는가… 진짜 어떻게 접근해야하는지 감이라도 왔으면 좋겠습니다….. 젭알,,,,