코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 1 두 개 뽑아서 더하기

_알파카 2024. 8. 22. 00:55
728x90

문제 설명

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

 

프로그래머스

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

programmers.co.kr

 

주어진 배열에서 두 개의 수를 뽑아 만들 수 있는 모든 수를 구하는 문제이다!

이전에 풀었던 문제와 비슷해서 쉽게 풀 수 있었다!

https://yeonnys.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4PYTHON-Lv-1-%EC%82%BC%EC%B4%9D%EC%82%AC

 

[프로그래머스][PYTHON] Lv. 1 삼총사

문제 설명https://school.programmers.co.kr/learn/courses/30/lessons/131705 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합

yeonnys.tistory.com

 

내 풀이

def solution(numbers):
    answer = []
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            tmp = numbers[i] + numbers[j]
            
            # answer에 존재하지 않은 새로운 값이면 추가
            if tmp not in answer:
                answer.append(tmp)
    return sorted(answer)

 

numbers = [2, 1, 3, 4, 1]이 주어졌을 때, 

우리가 필요한 계산은

2 + 1

2 + 3

2 + 4

2 + 1

-----

1 + 3

1 + 4

1 + 1

-----

3 + 4

3 + 1

-----

4 + 1

 

이다. 

나머지는 어차피 계산하더라도 순서만 바뀌는 것이기 때문에 할 필요가 없다. 

즉, 첫 번째로 numbers 루프를 돌며 차례대로 2, 1, 3, 4, ..를 순회하고

두 번째 순회에서는 해당 숫자 뒤에 나타나는 수를 순회하면 된다. 

즉, i가 0일 때 j는 1 ~ 4를 순회,

i가 1일 때 j는 2 ~ 4를 순회, 

i가 2일 때 j는 3 ~ 4를 순회, 

i가 3일 때 j는 4를 순회하게 된다. 

 

이 후, 계산한 값이 answer 배열에 없으면 그 값을 추가하고, 

구한 answer 배열을 정렬하여 반환한다. 

 

다른 사람 풀이

def solution(numbers):
    answer = []
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            answer.append(numbers[i] + numbers[j])
    return sorted(list(set(answer)))

 

나는 answer에 값이 있는지 판단하는 코드를 추가적으로 진행했는데, 

위의 코드와 같이 set을 이용하여 쉽게 중복을 없앨 수도 있다!

 

def solution(numbers):
    answer = set()
    for i in range(len(numbers)):
        for j in range(i+1, len(numbers)):
            answer.add(numbers[i] + numbers[j])
    answer = list(answer)
    answer.sort()
    return answer

 

혹은 위와 같이 애초에 answer을 set으로 설정할 수도 있다. 

위의 방법이 가장 좋은 방법인듯하다. 

 

728x90