# 완전탐색
문제
https://programmers.co.kr/learn/courses/30/lessons/42840
풀이
- 진짜 바보같이 풀어서 해설 생략... 다들 나보단 잘 풀었을 듯
- 최대값 구할 때 하나씩 비교하고 자빠짐... max는 어디에 뒀니?
코드
def solution(answers):
dataset1 = [1,2,3,4,5]
dataset2 = [2,1,2,3,2,4,2,5]
dataset3 = [3,3,1,1,2,2,4,4,5,5]
#반복되는 데이터 셋 설정
correct = [0, 0, 0]
#문제 하나 맞을 때마다 +1 됨, for문 돌리기 위해 리스트로 선언
#각 별개의 if문으로 답안과 학생 1,2,3의 찍은 답을 비교, 맞으면 +1
for k in range(0,len(answers)):
ans = answers[k]
if(dataset1[k%5] == ans):correct[0] = correct[0] + 1
if(dataset2[k%8] == ans):correct[1] = correct[1] + 1
if(dataset3[k%10] == ans):correct[2] = correct[2] + 1
#기본세팅으로 1이 가장 크다고 가정
answer = []
answer.append(1)
for i in range(1,len(correct)):
if(correct[answer[-1]-1] > correct[i]):
pass #학생 1의 인덱스는 0이므로 -1처리 (사실 -1의 인덱스를 굳이 고집할 필요가 없네)
elif(correct[answer[-1]-1] == correct[i]):
answer.append(i+1)
else: #더 큰값이 나타났을 경우 아예 초기화
answer=[]
answer.append(i+1)
return answer
딕셔너리 형, 2차원 배열을 이용하는 건 생각만 하다가... 복잡할 것 같아서 안했는데
두 가지를 합치니까 훨씬 간단해졌다.
처음엔 시간초과로 틀렸었는데, for문이 많아서 발생한 문제같았다 (case3의 처리시간이 200ms 가까이인걸 보면...)
이래서 최대한 시간 복잡도를 줄이라는 것 같다.
다른 풀이
- enumerate(list): 리스트에서 index, value를 세트로 가져와서 index에 대응하는 dataset의 인덱스 구하는데 사용
- 나중에 최대 값 구해서 answer 채울 때도 사용. 훨씬 깔끔하다
for index, value in enumerate(list)
- max 이용해 가장 많이 맞은 학생 구하기
for index, score in enumerate(correct):
if score == max(correct):
answer.append(index+1)
+
1. answer을 구성할 때, for문을 돌릴 필요 없이 아래와 같이 이용하면 [0, 0, 0, 0 ...] 이 생성된다.
answer = [0] * len(id_list)
2. for ~ in set(-)도 사용가능하다. set은 특정 값을 꺼내오는게 불가능한 것이다.
'Algorithm > Programmars' 카테고리의 다른 글
[Python/Level.1] 문자열 내 p와 y의 개수 (0) | 2022.07.12 |
---|---|
[Python/Level.1] 약수의 개수와 덧셈 (0) | 2022.07.12 |
[Python/Level.1] 음양 더하기 (0) | 2022.07.09 |
[Python/level.1] 로또의 최고 순위와 최저 순위 [2021 Dev-Matching: 웹 백엔드 개발자(상반기] (0) | 2022.07.07 |
[Python/Level.1] 신고 결과 받기 [2022 KAKAO BLIND RECRUITMENT] (0) | 2022.07.07 |