오늘 풀어본 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131705
한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
한국 중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
단계별 접근 방법
1. 리스트의 길이 구하기
- len(number)를 사용하여 리스트의 길이를 구합니다.
def solution(number):
answer = 0
n = len(number)
2. 중첩된 for 루프 작성
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
- 첫 번째 for 루프는 리스트의 첫 번째 요소부터 시작합니다.
- 두 번째 for 루프는 첫 번째 요소 이후부터 시작합니다.
- 세 번째 for 루프는 두 번째 요소 이후부터 시작합니다.
3. 합이 0인지 검사
- 각 조합의 합을 계산하고, 합이 0인지 검사합니다.
if number[i] + number[j] + number[k] == 0:
4. 카운트 증가
- 합이 0인 조합을 찾으면, 카운트를 증가시킵니다.
answer += 1
return answer
모든 결과 코드를 합치기
def solution(number):
answer = 0
n = len(number)
for i in range(n - 2):
for j in range(i + 1, n - 1):
for k in range(j + 1, n):
if number[i] + number[j] + number[k] == 0:
answer += 1
return answer
오늘 문제를 풀면서 가장 어려웠던 건 다중 for문이었다. 단순 for문으로 여러 조건을 걸어서 답을 찾아낸다는 것까진 이해하기 쉬웠지만 더 간결하게 코드를 작성할 수 없을까 생각하며 map과 enmerate나 filter나 컨프리헨션으로도 풀어보려고 다양한 접근법을 활용해 보았지만 결과적으로 다 실패하였다.
- map : 리스트 내의 모든 요소에게 조건을 실행 그렇기에 3가지만 조합해야하는 조건 때문에 적용하기 어려움
- enumerate : 인덱스의 값과 각 요소를 추출함 그렇기 때문에 활용할 수 있는 여지는 있지만 해당 문제 풀이를 하기엔 명령어의 특징상 어려움이 있음
- filter : 주어진 함수와 반복가능한 객체를 인자로 받아, 함수의 조건을 만족하는 요소들만 걸러내는 반복자를 반환 다만 map과 비슷한 이유로 삼중 for문을 대체하기엔 어려운 부분이 있음
- lambda : 익명함수 즉 간이? def 라고 생각하고 접근하기로 했다. 주로 복잡한 연산보다 간단한 연산작업을 할때 활용되며 주로 filter 와 한 묶음으로 활용되는 경우가 많다 filter 공부를 하다 같이 공부하게 되었다.
'Python' 카테고리의 다른 글
본 캠프 Python 알고리즘 코드카타 9일차 (0) | 2024.07.02 |
---|---|
본 캠프 Python 알고리즘 코드카타 8일차 (0) | 2024.07.01 |
본 캠프 Python 알고리즘 코드카타 6일차 (0) | 2024.06.29 |
본 캠프 Python 알고리즘 코드카타 5일차 (0) | 2024.06.28 |
본 캠프 Python 알고리즘 코드카타 4일차 (0) | 2024.06.27 |