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

유동헌·2021년 9월 24일
0

1일1알고리즘

목록 보기
10/12

링크

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

풀이

def solution(numbers):

    answer = []

    for i in range(len(numbers)):
        for j in range(len(numbers)):
            if i != j:
                answer.append(numbers[i] + numbers[j])

    answer = sorted(set(answer))

    return list(answer)

주요 개념 공부

1) 중첩 for loop

test_list = [1,2,3]

for i in range(len(test_list)):
    for j in range(len(test_list)):
        print('1 - i : ', test_list[i])
        print('2 - j : ', test_list[j])

# 출력
1 - i :  1
2 - j :  1

1 - i :  1
2 - j :  2

1 - i :  1
2 - j :  3

1 - i :  2
2 - j :  1

1 - i :  2
2 - j :  2

1 - i :  2
2 - j :  3

1 - i :  3
2 - j :  1

1 - i :  3
2 - j :  2

1 - i :  3
2 - j :  3
  • 첫 번째 for loop가 실행이 되고, 두 번째 for loop 안에 print 함수가 있으니 두 번씩, i는 계속 1이고 j만 바뀌어서 실행

풀이 과정

1) list, append, dictionary 시도

def solution(numbers):
    
    answer = []
    result = {}
    
    for i in range(len(numbers)):
        for j in range(len(numbers)):
                answer.append(numbers[i] + numbers[j])
    
    # answer = sorted(answer)
    
    for m in zip(answer):
        if m not in result:
            result[m] = 1
        else:
            result[m] = result[m] + 1
            
    print(result) 

print(solution([2,1,3,4,1]))

# 출력
{(4,): 5, (3,): 4, (5,): 6, (6,): 3, (2,): 4, (7,): 2, (8,): 1}
None
  • 타겟넘버 공부할 때처럼 먼저 다 넣고 그 후에 중복제거 후 반환하려고 하였고, 넣는 건 쉽게 넣었으나 중복된 값을 제거하는 부분을 잘 몰라서 딕셔너리로 만들어 1번째 값만 반환하려고(?) 했으나 보이는 것처럼 당연히.. 문제에 맞지 않게 나와서 실패. 생긴 것도 이상하게 만들어졌다.

2) set, list 변환, 중복

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

# 출력
입력값 〉	[2, 1, 3, 4, 1]
기댓값 〉	[2, 3, 4, 5, 6, 7]
실행 결과 〉	실행한 결괏값 [2,3,4,5,6,7,8]() 기댓값 [2,3,4,5,6,7]() 다릅니다.
테스트 2
입력값 〉	[5, 0, 2, 7]
기댓값 〉	[2, 5, 7, 9, 12]
실행 결과 〉	실행한 결괏값 [0,2,4,5,7,9,10,12,14]() 기댓값 [2,5,7,9,12]() 다릅니다.
  • 정렬과 중복 제거를 어떻게 할까 하다가, set으로 변환하고 다시 리스트로 변환해주면 된다는 set의 특성에 대한 글을 보았다! 바로 해결이 될 줄 알았는데, 실패. 실행 결과를 보면 기대값으로 들어간 숫자가 많다. 왜? 중복은 제거가 되었으나 같은 숫자가 더해진 경우가 생겼기 때문이다. 문제 자체가 서로 다른 인덱스 두 개를 더하는 건데, 내가 작성한 코드는 같은 숫자가 1번씩 더해진다. 그렇기 때문에 실패를 했다.

3) 세 번째 실패

def solution(numbers):
    
    answer = []
    
    for i in range(len(numbers)):
        for j in range(len(numbers)):
            if i != j:
                answer.append(numbers[i] + numbers[j])
    
    answer = set(answer)
    
    answer = list(answer)
    
    return answer
  • set으로 바꾸고 다시 list로 바꾸는 저 방법이 좋지 않아 보이긴 하지만.. 일단 해결이나 하자라는 심정으로 if i != j: 코드를 추가하여 해결해 보려고 하였다. 그렇게 하니 테스트케이스는 통과가 되었지만, 테스트 4, 5번이 해결이 되지 않았다!

4) 최종 해결.. 3번과 별로 다르지 않다.

느낀 점

1) 중첩 for loop 공부 보충하기

2) 문제 난이도에 비해 시간을 너무 많이 썼다.

profile
지뢰찾기 개발자

0개의 댓글