시원이와 함께하는 알고리즘 문제풀이 첫날!
벌써부터 한문제만 풀었따 하지만 내일은 2문제풀것이야
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한 조건
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
def solution(answers):
A = []
a_support = [1,2,3,4,5]
B = []
b_support = [2,1,2,3,2,4,2,5]
C = []
c_support = [3,3,1,1,2,2,4,4,5,5]
correct = [0,0,0]
answer = []
length = len(answers)
for i in range(length):
A.append(a_support[i%5])
B.append(b_support[i%8])
C.append(c_support[i%10])
if A[i] == answers[i]:
correct[0]+=1
if B[i] == answers[i]:
correct[1]+=1
if C[i] == answers[i]:
correct[2]+=1
if length != 0:
max = correct[0]
for i in range(3):
if max < correct[i]:
max = correct[i]
for i in range(3):
if correct[i] == max:
answer.append(i+1)
return answer
1. answer의 길이를 구한다.
2. 비교할 배열 a,b,c에 answer의 길이만큼 원소를 차례로 넣는다
3. answer과 값을 비교하며 맞춘 정답의 수를 기록한다.
4. 맞춘 정답의 수에서 최댓값을 구한다.
5. 최댓값과 맞춘 정답의 수를 비교하면서 같으면 출력한다. 이때, 순서대로 비교하기 때문에 자동으로 오름차순으로 출려된다.
[깨달은 점]
2번째 단계에서 원소를 차례로 넣는데, 2,1,2,3,2,4,2,5로 규칙성이 보이질 않았다.
조건문으로 규칙성있게 원소를 삽입하려 했는데 잘 안돼서 고민하다가 배열을 하나 더 만들어서 그 배열의 값을 통해 넣어줬다.
아래는 그 코드이다.
A = []
a_support = [1,2,3,4,5]
A.append(a_support[i%5])
"규칙성이 없는 숫자를 넣을때 배열을 하나 더 만들어서 넣을 수 있다"
[다른 사람의 코드를 보고 깨달은 점]
def solution(answers):
pattern1 = [1,2,3,4,5]
pattern2 = [2,1,2,3,2,4,2,5]
pattern3 = [3,3,1,1,2,2,4,4,5,5]
score = [0, 0, 0]
result = []
for idx, answer in enumerate(answers):
if answer == pattern1[idx%len(pattern1)]:
score[0] += 1
if answer == pattern2[idx%len(pattern2)]:
score[1] += 1
if answer == pattern3[idx%len(pattern3)]:
score[2] += 1
1. 나의 알고리즘에서 2번째 단계처럼 따로 배열을 안만들고 바로바로 비교하면 된다.
2. 나처럼 숫자를 적는 것보다는 len메소드를 사용한다면 더욱 확장성이 좋은 프로그램이 된다.
3. max값을 구할때도 이미 메소드가 주어져있으니깐 메소드를 적극 사용하자.
for idx, s in enumerate(score):
if s == max(score):
result.append(idx+1)
return result
1. pattern에 대한 배열을 만든다.
2. 따로 배열을 만들지 않고 바로바로 비교한다. enumerate메소드를 사용하면 index와 value가 동시에 할당된다.
3.비교한 것에서 최대값과 비교하여 결과배열에 추가한다.
2개의 단계가 사라졌다...!
'이제는 사용하지 않는 공부방 > Algorithm' 카테고리의 다른 글
[알고리즘] 그리디 알고리즘 연습 (0) | 2020.09.24 |
---|---|
[백준] 섬의 개수 (0) | 2020.09.15 |
백준 8단계 크로아티아알파벳 자바 (0) | 2020.04.18 |
백준 8단계 다이얼 자바 (0) | 2020.04.18 |
백준 8단계 상수 자바 (0) | 2020.04.18 |