알고리즘 풀이

[프로그래머스] 연습, Python | 두 개 뽑아서 더하기

째깍단 2024. 3. 8. 19:46

두 개 뽑아서 더하기

답: 

더보기
def solution(numbers):
    answer = []
    while numbers:
        now = numbers.pop()
        for n in numbers:
            answer.append((now + n))
    return sorted(list(set(answer))) # 여기 주의

 

def solution(numbers):
    answer = []
    while numbers:
        now = numbers.pop()
        for n in numbers:
            r = now + n
            if r in answer:
                continue
            else:
                answer.append(r)
    return sorted(answer)

 

 

문제 분석 및 해석

 

정수 배열 numbers가 주어질 때 numbers내 서로 다른 인덱스에 있는 두개의 수를 뽑아 더한다.

만들 수 있는 모든 수를 배열에 담아 return해주기.

 

 

>> 풀이생각

 

** 주의할 점

- 인덱스만 다르고, 같은 숫자가 있을 수 있음.

- 같은 인덱스에 위치한 숫자를 두번 쓸 수 없음 (= 단순하게 for문만으로는 안된다.)

 

 

 

1) stack 개념을 차용해서 빼낸 숫자와 나머지 수를 모두 곱하여 answer array에 append.

 

 

2) 결과값이 같은 수를 걸러낼 수 있는 로직이 필요함

 

방법 :

- set함수.

- if로 미리 걸러서 append 해주기

 

 

 

 

 

 

풀이.

 

1) stack개념 차용

 

numbers에서 stack.pop()으로 마지막 요소를 빼내고, for문으로 남은 수를 각각 빼내어 계산할 수 있도록 함

while numbers:
    now = numbers.pop()
    for n in numbers:
        ...

 

 

 

 

 

2) 결과값이 같은 수를 걸러내기

 

 

방법 1 : set-list-sorted 사용

    for n in numbers:
        answer.append((now + n))
return sorted(list(set(answer)))

 

 

이 방법에서 주의할 점 :

  answer배열을 set형태로 변경할때 자동으로 sort상태로 변경해주지만

  list로 변경할때 인덱스 위치가 바뀔 수 있으므로 꼭 sorted로 한 번 정렬해주어야한다.

 

 

 

 

방법 2 : 미리 if문으로 점검

...
    for n in numbers:
        r = now + n
        if r in answer:
            continue
        # else:
        answer.append(r)
return sorted(answer)

 

 

answer 배열에 계산한 결과값이 있는지 확인하고, True면 append없이 continue로 다음단계로 넘어가도록 한다. 

 

else는 생략이 가능하므로 깔끔하게 정리했다.

 

 

 


 

 

 

set - list - sorted는 전체적으로 무난한 결과를 얻었는데,

if문으로 점검하는 경우 while문이 과도하게 돌아가는 케이스가 있는 듯 하다. (4.34ms)

 

set() list() sorted() 사용한 결과
if문으로 미리 걸러 append한 결과


 

프로젝트하다가 알고리즘에 소홀해져서 다시 차근차근 폼 올리는 중이다.

lv.1-2 위주로 기억 되살리고 3단계 도전 가즈아