본문 바로가기
python

2020.08.29_알고리즘_모의고사

by 해맑은 코린이 2020. 8. 29.

2020.08.29_모의고사 알고리즘_정리노트

 

오늘은 또 나를 한끝차이로 괴롭힌 모의고사 알고리즘 정리노트! 

 

출처 - 프로그래머스

 

 

문제를 잘읽자...( 벌써 몇번쨰 흑흐그극 ... ) 쨋든 이렇게 배열들이 주어졌을 때, 우리는 여기서 답을 가장 많이 맞춘 사람의 번호를 리스트로 리턴하면 된다!

 

여기서는 런타임 오류가 계속 떠서 나는 또 효율성인가.. ( 파이썬에 재귀문을 많이 쓰면 런타임 오류가 난다기에 )

 

 

결국 코드가 정확하지 못한거였다..! ^ ^ 오늘도 우당탕탕 가보게씀미다..

 

 

 

 

이번에는 드디어 enumerate를 써봤다 ! ㅎㅁㅎ for문과 if문을 한 줄로 바로 리스트에다가 담아줄 수가 있었지 ㅎㅎ

 

그 전에 big = max( cnt ) 에서 쓰인 max 함수와 함께 min을 알아보자!

 

 

max

는 리스트나 반복가능한 자료형에서 최대값을 리턴하는 함수이다.

 

min

은 반대로 최소 값을 리턴함!

 

간단하지만, 파이썬 내장함수 기능을 모른다면... 나는 또 for문을 써서 복잡하게 해결했겠지

 

 

 

 

 

다음은 enumerate 코드 해석으로 ㄱㄱ

 

enumerate 함수 설명은 여기로!

 

korinkorin.tistory.com/4

 

2020.08.21 알고리즘_같은 숫자는 싫어

2020.08.21 같은 숫자는 싫어__알고리즘 정리노트 오늘은 k번째 수와 함께 미뤄왔던 같은 숫자는 싫어... 생각한대로 풀었던 과정 노트. 처음 생각한 방법 ( 빨간색은 인덴트가 잘못되었다는 말인데

korinkorin.tistory.com

 

 

 

[ i+1 for i, j in enumerate(cnt) if j == big ] 해석

 

 

 

우리는 i+1을 리스트에다가 담아줄건데, ( i는 순서를 나타내는 값인데, 0부터 시작하니까 +1 )

 

cnt 라는 리스트를 for문으로 순회를 해서 각 값의 순서인 i, 순서의 값인 j 를 enumerate를 통해, 같이 나타내 주었다.

 

하지만 뭐만 담아줄거냐? 

 

if j == big 을 통해 j 값이 최대값인 big ( 위에서 big =  max(cnt) 를 통해 최대값을 변수로 담아줌. ) 이랑 같은 수만 담아주자!

 

이렇게 하면 최대값이 같아도 하나만 나오지 않고, 전부 다 리스트에 담아줄 수 있게 된다 ㅎㅎ!

 

 

 

 

마지막으로 코드에서 if문으로 3개로 써준 것은,  elif나 else 사용시, 위에서 값을 만족하게 되면 밑의 elif, else 문들은 실행이 되지 않기 때문에, if문을 써주었다. 그러면 각각의 조건에 들어가서 맞으면 카운트로 +1을 해준다.

 

 

자 근데 이 코드를 돌리게 되면, 

 

 

 

 이렇게... 허허 런타임 에러가 뜬다.... 왜 그럴까......왜왜...... 최대값을 담아주는 값을 열심히 여러 형태로 고쳐봤자 소용이 없다.. 왜냐 다른 곳이 틀렸기 때문!!!!!!!

 

 

 

문제를 ...잘 보자 우리가 입력 테스트 케이스에는 답이 5개밖에 없었지만, 이게 만약 넘어간다면?

 

 

 

 

6개의 정답을 놓고 돌리면,

 

 

 

ㅇㅎㅇㅎㅇㅎ 첫번째 사람의 찍은 리스트는 5개 뿐인데,  for문이 돌다가 6번째가 되면, 첫번째 학생의 6번째로 찍은 값은 존재하지 않기 때문에 리스트 범위에서 벗어나버린다.. 정확성이 없는 코드인 것... 후..

 

자 그러면 첫번째, 두번째, 세번째 학생이 찍은 패턴의 길이가 다르니 각각 값을 주어야한다. 어떻게 했냐면,

 

 

이렇게 나머지를 통해 만약 6번째 값이 있다. 그러면 6나누기 5의 나머지는 1이 되니까 다시 1로 돌아간다! 나머지도 길이가 넘는 정답배열이 있다면 나머지를 나타내는 %을 통해 다시 첫번째 값으로 돌아가 순서대로 또 비교해주게 만들면 된다!

 

 

이렇게 하면 성공적으로 정답완성이다!!!!!!!!!!!

 

정말 코드가 완벽해보여도 다른 경우의 수는 항상 있을 수 있다는 생각을 하게 된 문제였다 ㅠㅠ!

 

 

이제 다른 사람의 풀이에서 또 새로운 기능들을 정리해봐야지

 

 

 

출처 - 프로그래머스

 

여기서 보면 새로운 것들이 참많군... 바로 cyclenext. 정리해보자.

 

cycle ,next

은 next 와 함께 쓰는 무한 순회 기능을 가진 함수이다. iterable 에서 cycle을 불러와서 써줄 수 있고, cycle에 리스트를 넣고 next()를 통해 순서대로 다음 값을 호출해준다. 그리고 마지막 값이 끝나게 되면, 처음으로 돌아가 다시 무한으로 반복한다.

 

그래서 이 코드에서 정답 리스트와 각 학생이 찍은 답 리스트를 하나로 묶어서 각각 for문을 통해 순회하게 하고, 각각 호출된 next 값이 정답의 순서와 맞으면 맞춘 숫자의 개수를 각각 score라는 곳에다가 카운트 해준다.

 

그리고 나머지는 나처럼 최대값을 정해주고 enumerate를 통해서 저렇게 표현해준 것이다! 

 

이렇게하면 각각 리스트의 나머지를 구하지 않아도 순서를 맞추며 계속 정답과 비교해주는 것이다!

 

 

훠.. 역시 대단한 기능들을 오늘도 배우며 오늘의 포스팅 끝!

댓글