-
프로그래머스 알고리즘 문제 - 영어끝말잇기(python)알고리즘 문제 풀이 연습 2021. 7. 9. 02:30
참여자의 수(n)과 끝말잇기 단어들이 이어지는 순서대로 정렬된 배열(=words)이 입력값으로 주어지면, 첫 탈락자의 번호와 탈락한 차례를 넣은 배열을 구하라는 문제다.
입출력 예를 보면 두가지 경우에 탈락이 결정된다.
1. 앞서 나온 단어를 말할 경우
2. 앞 단어의 마지막 철자와 뒷 글자의 첫 철자가 달라 끝말잇기가 안 되는 경우.두 가지 경우를 모두 담아서 푼 코드는 다음과 같다.
# n : 참가인원수, words: 끝말잇는 단어순으로 정렬된 배열 def solution(n, words): answer = [] for i in range(1, len(words)): # 앞 단어의 마지막 철자와 뒷 단어의 첫 철자가 다를 때 if words[i][0] != words[i-1][-1]: wrong_person = i % n + 1 wrong_order = i // n + 1 answer.append(wrong_person) answer.append(wrong_order) break # 앞서 말한 단어를 다시 말한 경우 else: cnt = words[:i].count(words[i]) if cnt == 1: wrong_person = i % n + 1 wrong_order = i // n + 1 answer.append(wrong_person) answer.append(wrong_order) break if len(answer) != 0: return answer else: return [0, 0]
여기서 주목해야 할 것은 if문과 else문 모두에서 마지막에는 break를 꼭 해줘야 한다는 것이다. 왜냐하면 한번 틀린 자리에서 for문이라는 순환루프를 그만두면 되는데, break를 하지 않으면 그 다음 단어들이 틀린 경우가 있는 검색하게 되기 때문이다. 그래서 break를 하지 않으면 프로그래머스는 오답이라고 해준다.
프로그래머스의 실력자들이 이 문제를 고작 5줄도 안되게 풀어버렸는데, 이건 정말 아름답다고 밖에 표현할 말이 없는 코드다. 한번 보자.
# simple and good solution def good_solution(n, words): for i in range(1, len(words)): if words[i][0] != words[i-1][-1] or words[i] in words[:i]: return [(i%n)+1, (i//n)+1] else: return [0,0]
if문 안에 끝말잇기가 종료되는 조건을 한큐에 담아버렸다. 이러니 훨씬 간결해졌고 return으로 끝내버렸다. return은 값도 출력하고 함수도 종료시켜버리니 break의 효과도 있어서 쓸데없이 break도 쓰지 않아도 되는 코드다.
'알고리즘 문제 풀이 연습' 카테고리의 다른 글
프로그래머스 알고리즘 문제 - 2 x n 타일링(python) (0) 2021.06.27 프로그래머스 알고리즘 문제 - 나머지 한 점 좌표 구하기(python) (0) 2021.06.27 프로그래머스 알고리즘 문제 - 예상대진표(python) (0) 2021.06.27