본문 바로가기
Python

본 캠프 Python 알고리즘 코드카타 7일차

by Data 학습자 2024. 6. 30.

오늘 풀어본 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131705

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 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 공부를 하다 같이 공부하게 되었다.