사실 알고리즘 문제를 풀진 못했다.
우선 문제는 아래와 같다.
수포자 3명의 찍기 패턴은 다음과 같다.
수포자1 = [1,2,3,4,5]
수포자2 = [2,1,2,3,2,4,2,5]
수포자3 = [3,3,1,1,2,2,4,4,5,5]
그리고 나의 풀이는 밑에와 같다.
while len(sp1) < 20:
j = [1,2,3,4,5]
sp1.append(j[i])
if i == len(j)-1:
i -= len(j)-1
else:
i += 1
while len(sp2) < 20:
j = [2, 1, 2, 3, 2, 4, 2, 5]
sp2.append(j[i])
if i == len(j)-1:
i -= len(j)-1
else:
i += 1
while len(sp3) < 20:
j = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
sp3.append(j[i])
if i == len(j)-1:
i -= len(j)-1
else:
i += 1
while 반복문으로 1번째 조건인 문제는 10000문제까지만 있다는 조건을 충족시킬려고 작성했다.
(위 코드는 메모리를 굳이 많이 잡아 먹을필요를 못느껴서 20으로 조건을 낮춰 놨다.)
2번째 조건은 1,2,3,4,5중에 하나이다 복수정답도 없기에 따로 식을 더 복잡하게 할 필요가 없었다.
여기서 다음 단계로 나아가기 위해 몇가지 고민을했다.
- answers(정답지)의 인덱스와 수포자들의 답안지 인덱스는 상이하기 때문에 서로의 인덱스를 맞추기위해 새로운 반복문과 새로운 변수를 하나씩 할당하는데 코드가 안그래도 긴데 더 길어진다.
- 여기서 정답을 대입하고 맞추는식을 수포자마다 또해야한다.
이런 고민을하면서 내가 코드를 풀면 코드가 한 30줄 될거 같아서 그냥 답안지를 보기로했다.
첫번째 답안지는 아래와 같다.
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
for idx, s in enumerate(score):
if s == max(score):
result.append(idx+1)
return result
- 각 수포자 별로의 패턴을 리스트화 시켜놓고 pattern숫자 로 변수에 리스트를 할당.
- enumerate()함수를 이용해 인덱스와 답을 idx,anwer 변수에 할당하고 반복문을 사용
- pettern숫자[idx%len(pettern1)]을 모든 수포자에게 동일하게 적용하여 답안지와 정답지의 인덱스를 동등하게 맞추었다.
- 만약 정답이 맞을시 socre 리스트의 수포자의 맞는 인덱스에 1점을 추가하게 하였다.
두번째코드
- 이번엔 스코어에 enumerate() 함수를 사용하여 인덱스와 값을 변수 idx,s 에 각각 할당하고 반복문을 사용
- if~~문구는 결과 s가 socre리스트중 가장크다면 result에 인덱스+1로 추가하는 방식이다(인덱스는 0 부터시작 수포자는 1부터시작하기때문에 이런 방법을 사용)
내가보기엔 이코드가 가독성과 간결함을 다 잡은 아주 좋은 코드같았다.
두번째 풀이
def solution(answers):
p = [[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
s = [0] * len(p)
for q, a in enumerate(answers):
for i, v in enumerate(p):
if a == v[q % len(v)]:
s[i] += 1
return [i + 1 for i, v in enumerate(s) if v == max(s)]
- p라는 변수에 중첩리스트로 수포자별 패턴을 리스트화 했다.
- s 변수는 위 식에서 와 같이 score = [0,0,0]처럼 [0,0,0]리스트를 만드는 식이다.
두번째코드
- q,a는 q는 정답지의 인덱스 a는 정답지의 답
- i는 p리스트의 1차원 인덱스이고 v는 p리스트의 1차원 값이다.
- v[q % len(v)]라면 스코어에 1점씩 더하는방식인데 v는 해당 수포자의 답안지이고 [q%len(v)]란 답안지의 인덱스에 수포자의 정답지 길이를 나누는것 즉 답안지와 정답지의 인덱스를 맞추는 방식이고
- s[i] += 1 는 수포자별로 정답이 맞았을때 스코어에 점수를 더해주는 방식이다.
세번째 코드
- v는 수포자별 점수 i는 인덱스 == 수포자번호-1
- i+1은 수포자의 번호를 인덱스에 비례하게 하기위해 맞춰놓은값
- 즉 점수가 높은 수포자를 구해서 return 하는 식이다.
첫번째 풀이는
가독성과 코드를봤을때 직관성이 굉장히 뛰어나다.
두번째 풀이는
가독성도 떨어지고 코드를 봤을때 직관성또한 떨어지지만 간결한 코드이다.
먼저 직관성은 먼저 변수 네이밍에서부터 시작하는것 같다.
score,pattern등 변수 네이밍은 생각보다 중요하며 코드를 짤때 항상 고민해봐야할 것 같다
그리고 두사람의 스코어 리스트느 [0,0,0]을 만드는 방식도 눈에 띈다.
사실 이것도 첫번째 분이 좀더 직관성이 높지만
수포자가 많아질수록 두번째분의 방식이 더 좋을 수 있다고 생각된다.
마지막으로 return값에 대해서 두번째분은 리스트표현식을 사용하였는데 이부분또한 나에겐 직관성이 높지않다.
다만 리스트표현식에 적응된 사람이라면 두번째 방식이 더 깔끔하고 보기좋다고 평할수도 있을 것 같다.
'Python > Python 문제' 카테고리의 다른 글
(3)별로 사각형 간단하게 그리기 (0) | 2022.05.06 |
---|---|
(2)포켓몬 종류 찾기 (리스트 & 세트) (0) | 2022.05.06 |
(3)클래스 메서드와 속성으로 시계 만들기 (0) | 2022.04.14 |
(2)2차원리스트를 활용하여 순서대로 숫자 작성하기 (0) | 2022.04.01 |
(1)Python 으로 지뢰 찾기 만들기 (0) | 2022.03.30 |