[Python] 영어 끝말잇기

Saemi Min·2023년 2월 1일
0

Programmers Algorithm

목록 보기
5/29
post-thumbnail

문제

문제 링크

풀이

순회한 단어들은 리스트에 넣어 안에 있는 지 not in 배열 을 써서 확인하고, 알파벳의 끝 단어와 앞 단어가 같은지 확인을 AND 연산자를 써서 확인한다.
탈락자에 해당하는 반환 값은 나머지 연산자와 몫을 구하는 연산자에 +1을 더하여 계산한다.

처음 접근 방식

  • 앞 단어가 뒷 단어와 일치하는가 맞다면 True 아니라면 False 먼저 해보자
def solution(n, words):
    answer = []    
    for i in range(0,len(words)-1):
        if(words[i][-1] == words[i+1][0]):
            print("True")
        else:
            print("False")
    return answer
  • 중복된 단어를 갖고있는가 확인
    for i in range(0,len(words)-1):
        for j in range(i+1,len(words)):
            if(words[i]==words[j]):
                print(words[j])
                print(j)
                break
  • 그리하여 합친 코드
    : 이때 if(y%n==0)으로 바로 떨어지는 값은 다르게 넣어줌
def solution(n, words):
    answer = []
    
    a=len(words)
    flag=0
    
    for i in range(0,len(words)-1):
        if(words[i][-1] == words[i+1][0]): #앞 단어가 뒷 단어와 일치하는가 맞다면
            # print("True")
            flag=1
        else: #아니라면 바로 잡아냄
            # print("False")
            # print(words[i+1])
            # print(i+1)
            x=(i+1)+1
            answer.append(x%n)
            answer.append((x//n)+1)
            
            
    #앞 단어가 뒷 단어와 일치하는가 맞다면
    if(flag==1):
        #중복된 단어를 갖고있는가 확인
        for i in range(0,len(words)-1):
            for j in range(i+1,len(words)):
                if(words[i]==words[j]): #중복된 단어를 갖고있으면
                    # print(words[j])
                    # print(j)
                    y=j+1
                    if(y%n==0):
                        answer.append((y%n)+n)
                        answer.append((y//n))
                    else:
                        answer.append(y%n)
                        answer.append((y//n)+1)    
                    break
                    
    #앞 단어가 뒷 단어와 일치도 하고 중복된 단어를 갖고있지 않음
    if(len(answer)==0):
        answer.append(0)
        answer.append(0)
   
    return answer

하지만..!!! 틀린 답이라고 나왔다.. 잘 구분해서 접근했다고 생각했는데 코드를 너무 복잡하게 짜기도 했고, 그 과정에서 놓치는 부분이 있을 거 같다. 좀 더 코드를 작성하다가 결국 다른 사람의 코드를 참고하여 풀었다.

def solution(n, words):
    answer = [0,0]

    cnt = 0  # 탈락번호,차례 계산할 변수
    checks = []  # 나온 단어 확인할 리스트
    checks.append(words[0])
    for i in range(1, len(words)):  # 단어 순회하면서
        cnt += 1
        # 아직 안나온 단어이면서 & 앞 단어의 마지막 알파벳과 일치하면 checks 리스트에 넣음 (pass)
        if words[i] not in checks and list(words[i-1])[-1] == list(words[i])[0]:
            checks.append(words[i])
        else:  # (fail)
            answer[0] = cnt%n +1  # 탈락번호
            answer[1] = cnt//n +1  # 탈락차례
            break

    return answer

너무 간단하게 나와서 당황스러웠다.. 이 문제 꼭 다시 풀 예정이다!!!!


결과


해석 및 기억할 부분

Git

  • 순회한 단어들은 리스트에 넣어 안에 있는 지 not in array 을 써서 확인
    (이중 for문을 써서 하나씩 확인할 필요 없이 리스트 파이썬의 문법을 잘 활용하자!)
profile
I believe in myself.

1개의 댓글

comment-user-thumbnail
2023년 2월 3일

잘 보고 갑니다 😊

답글 달기