본문 바로가기

Python

[알고리즘_Programmers] 5주차 문제 및 풀이 (총 5 문제)

※ 5주차부터는 문제도 길어지고 난이도도 좀 높아졌다.

 

<문제 1번>

 

<1. 나의 풀이>

 

우선 주어진 x 가 문자열이 아니므로, x 를 문자열로 변경시킨 후에 리스트로 변환해주어야 한다.

 

이 과정만 문제 없이 구현한다면 정말 간단한 문제이다. ^^

 

<2. 내 풀이보다 더 효율적인 풀이>

 

위에서 내가 한 작업을 한 줄로 요약해줄 수도 있넹 ㅎㅎㅎ..

 

 

<문제 2번>

 

<1. 나의 풀이>

 

이 문제도 큰 무리 없이 풀었다.

 

주어진 arr 리스트의 각 요소 값들을 divisor로 나눠보면서, 나누어 떨어지는 값들만 result 리스트에 추가하고 sort( )로 정렬해준다.

 

<2. 내 풀이보다 더 효율적인 풀이>

 

마찬가지로 내가 위에서 해준 작업들을 list comprehension을 사용하면 한 줄로 구현이 가능하다.

 

근데 난 왜 이렇게 좋은걸 안 써먹는거지.... 쓰려는 노력이라도 좀 하자!! ^^;;

 

 

<문제 3번> --> 좀 많이 어려웠음...

 

<1. 나의 풀이>

우선 본격적인 풀이에 앞서 이번 풀이에서 사용한 cycle 모듈에 대해서 간략하게 설명해보면,

 

cycle 모듈을 사용하면, 순환 가능한 객체에서 요소를 반복적으로 생성할 수가 있다.

 

즉, 다음과 같이 리스트 안의 요소 값들을 차례대로 계속 불러온다는 것을 알 수 있다.

 

자, 그럼 이제 본격적으로 <문제 3. 모의고사> 풀이를 진행해볼까?

 

 

제일 먼저 각 수포자들의 정답을 찍는 패턴을 a1, a2, a3의 리스트로 구성해주었다.

 

그 다음, 수포자들의 점수를 체크해줄 길이 3인(len = 3) 배열(scores)를 만들고, 0점으로 초기화해주었다.

 

그리고 for 문과 zip 함수를 사용하여 실제 정답과 수포자들이 찍은 답을 비교해주는 작업을 수행하였다.

(수포자들이 정답을 맞출 때마다, 0으로 초기화해놓은 scores 리스트의 해당 요소 값들이 1씩 증가한다)

 

마지막으로 for 문과 enumerate 함수를 사용하여 수포자들의 score 중, 최댓값과 그 최댓값에 해당하는 index를 뽑는다.

(여기서 주의할 점은 index 값은 "0" 부터 시작하므로, "idx +1" 을 해주어야 한다!!)

 

이렇게 다 풀어놓고 보면, 그렇게 어려운 문제 같지는 않은데... 실제로 처음 이 문제를 접하면 와... 이게 뭐지?? 라는 생각이 든다.

 

내 사고력이 아직 많이 부족하다는 증거겠지...? 더 열심히 해야겠다!!

 

<2. 내 풀이보다 더 효율적인 풀이>

 

위의 풀이 방식은 전체적으로는 내가 풀이한 방법과 유사하다.

 

다른 점은 for 문과 enumerate 함수를 2번 사용해서 실제 정답과 수포자들이 찍은 답을 비교해주었다는 점이다.

(개인적으로는 위 코드보다 내가 풀이한 방식의 코드가 더 와닿는 듯...? 싶다. 내가 풀어서 그런가 ㅎㅎㅎ...)

 

 

<문제 4번>

 

<1. 나의 풀이>

 

이 문제는 collections 모듈에 있는 Counter 라는 클래스를 사용하면 쉽게 풀 수 있다.

 

Counter() 클래스는 주어진 리스트의 각 요소 값들의 중복 값 개수"딕셔너리" 형태로 반환해준다.

 

이를 활용해서, participant 리스트의 중복 값 개수와 completion 리스트의 중복 값 개수가 동일하지 않으면, 해당 이름(값)은 완주하지 못한 선수의 이름(값)이므로 result 리스트에 추가해주는 방식으로 진행했다.

 

또한 마지막에 return 할 때, result가 아닌 result[0]를 반환해주어야 완주하지 못한 선수의 이름이 한 개만 출력된다!!

 

<2. 내 풀이보다 더 효율적인 풀이>

 

다른 사람들 역시 collections 모듈Counter 클래스를 사용해서 코드를 구현했다.

 

다만 여기서는 "딕서녀리" 빼기(-) 연산을 사용하여 풀었는데, 이 방법은 잘 기억해두는 것이 좋겠다.

 

"딕서녀리" 빼기(-) 연산에 대한 내용을 코드 위쪽에 추가해놓았으니, 풀이가 잘 이해되지 않는다면 참고하자!!

 

 

<문제 5번>

 

<1. 나의 풀이>

 

이 문제는 datetime 모듈에 있는 weekday() 함수를 사용하면 쉽게 풀 수 있다.

 

weekday() 를 사용할 때, 주의할 점은 "0: 월요일" 이라는 점이다.

 

** weekday() 함수와 관련된 링크를 첨부해두니, 필요할 때 참고하도록 하자!!

<출처: 김도형의 데이터 사이언스 스쿨>

https://datascienceschool.net/view-notebook/465066ac92ef4da3b0aba32f76d9750a/

 

Data Science School

Data Science School is an open space!

datascienceschool.net

 

<2. 내 풀이보다 더 효율적인 풀이>

 

이 풀이는 2016년 1월 1일이 "금요일"이라는 것을 참고하여 접근한 방식이다.

 

위 풀이처럼 푸는 방법도 있을 수 있겠다...