프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/131701
[나의 풀이]
⌛ 40분 소요
def solution(elements):
from collections import deque
elements = deque(elements)
len_el = len(elements)
answer = set()
# 돌리기
for i in range(1,len_el+1):
tmp = elements.copy()
for j in range(1,len_el+1):
answer.add(sum(list(tmp)[:i]))
tmp.rotate(1)
answer.add(sum(list(tmp)))
return len(answer)
원형 수열에서 모든 케이스의 연속된 요소를 더하여 생긴 합이 갯수를 구하는 문제입니다. 입력된 리스트를 deque로 변환하고 한칸씩 rotate하여 1~리스트 길이(len(elements)만큼 씩 더해보며 답을 구하는 방식입니다. 중복값을 제거하기 위해 set() 구조에 넣었습니다.🐸🐸🐸
[다른사람의 풀이1]
def solution(elements):
answer = 0
cycle = elements + elements
s = []
for i in range(len(elements)):
for j in range(len(elements)):
s.append(sum(cycle[i:i+j]))
return len(set(s))
2중 for문으로 해결한 다른 풀이를 볼 수 있었는데 문제 테스트 케이스 기준 성공은 되지만 정확히 따지고 보면 이는 잘못된 풀이었습니다. 문제에서 요구하는 사항은 1~전체 리스트 요소 갯수까지 더하며 모든 케이스를 구하라는 것인데 위 코드대로 라면 입력된 리스트를 모두 더한 합은 구할 수 없습니다. 대신 인덱스 [0:0],[1:1]... 과 같이 합이 무조건 0이 되는 케이스가 추가되었고 이는 리스트 요소를 모두 더한 합은 1개인 관점에서 결론적으로 문제에서 최종적으로 요구하는 합의 갯수가 같아져 성공된 것으로 보입니다. 타 블로그에 있는 풀이를 맹신하지 않는 것이 좋다고 느꼈습니다.🐦🐦🐦
[다른사람의 풀이2]
def solution(elements):
sum_unique = set()
# 성분 개수
for n in range(len(elements)):
# 시작점
for i in range(len(elements)):
# 배열의 길이 초과할 경우
if n + i > len(elements):
e_sum = sum(elements[i:]) + sum(elements[:i + n - len(elements)])
else:
e_sum = sum(elements[i:i + n])
sum_unique.add(e_sum)
return len(sum_unique)
2중 for문에서 인덱싱을 통해 구현한 풀이입니다. 0~n번의 요소까지 더하되 인덱스가 입력된 리스트의 길이를 초과할 경우 음수인 인덱스를 변환하여 풀어낸 방식입니다.🐻❄️🐻❄️🐻❄️
감사합니다.