[Programmers] - 두 개 뽑아서 더하기

odh0112·2021년 3월 12일
0

Algorithm

목록 보기
5/44
post-thumbnail

1. Problem 📃

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

다음 문제는 정수 배열이 주어졌을때, 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해 만들수 있는 모든 수를 오름차순으로 정렬해 반환하는 함수를 만드는 것 입니다.

2. Logic 👨‍🏫

  1. 일단 더할 수 있는 모든 경우의 수를 다 더한다
  1. 중복 제거
  2. 오름차순 정렬

3. Code 💻

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))))

4. Feedback 📚

4.1 중복 제거하기

4.1.1 set을 이용해 중복 제거하기

  • 집합 자료형은 크게 두가지 특징이 있다.
    • 중복을 허용하지 않는다
    • 순서가 없다.

이 두가지 특징 중 첫번째 특징을 이용하여 중복을 제거할 수 있다.

my_list = ['A', 'B', 'C', 'D', 'B', 'D', 'E']
my_set = set(my_list)  #집합set으로 변환
my_list = list(my_set)   #list로 변환
print(new_list)
출력된 값은 ['D', 'B', 'A', 'E', 'C']

set의 방식으로 중복을 제거할 경우, 순서가 뒤죽박죽 된다는 단점이 있다. 만약 순서를 지켜야 하는 경우, 반복문을 사용한다.

4.1.2 For문을 이용하여 중복 제거하기

  • my_list의 모든 요소를 순회하며 해당 요소가 new_list에 있는지 확인한 다음 해당 요소가 존재하지 않으면 new_list에 추가한다. 반복문과 조건문을 이용한 방법으로 순서가 유지된다.
my_list = ['A', 'B', 'C', 'D', 'B', 'D', 'E']
new_list = []
for v in my_list:
	if v not in new_list:
        new_list.append(v)
print(new_list)
출력된 값 ['A', 'B', 'C', 'D', 'E']

4.2 List(리스트) 원소 추가, 삭제하기

4.2.1 List 원소 추가

  • append: 원소 마지막에 추가
>>> a = [1, 2, 3, 4, 5]
>>> a.append(6)
>>> a
[1, 2, 3, 4, 5, 6]
  • insert: 리스트.index(입력할 index, value)
>>> a = [1, 2, 3]
>>> a.insert[1, 5]
>>> a
[1, 5, 2, 3]
  • +연산자로 더하기
>>> m = [1, 2, 3]
>>> n = [4, 5, 6]
>>> k = m + n
>>> k
[1, 2, 3, 4, 5, 6]
>>> k += [7, 8]
>>> k
[1, 2, 3, 4, 5, 6, 7, 8]
  • extend method: 리스트.extend(추가할 리스트)
>>> a = [1, 2, 3]
>>> a.extend([4, 5 ,6])
>>> a
[1, 2, 3, 4, 5, 6]

4.2.2 list 원소 삭제

  • del 키워드를 통한 삭제
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> del a[1]
>>> a
[1, 3, 4, 5, 6, 7]
  • list의 remove method에 의한 삭제
  • list.remove(찾을 아이템)
  • 찾을 아이템이 없으면 ValueError 발생
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a.remove(3)
>>> a
[1, 2, 4, 5, 6, 7]
>>> a.remove(9)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
  • del키워드와 리스트의 index method와 혼합하여 사용하면 remove 효과가 난다
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> del a[a.index(3)]
>>> a
[1, 2, 4, 5, 6, 7]

numbers = [0, 3, 6, 9]
answer = [numbers[0] + numbers[1]] * len(numbers) * len(numbers)
sum = 0
for i in range(len(numbers)):
    for j in range(i+1, len(numbers)):
        sum = i*len(numbers) + j
        print(sum) # 출력 테스트
        answer[sum] = numbers[i] + numbers[j]
sub = set(answer) #집합set으로 변환a
answer1 = list(sub) #list로 변환
answer1.sort()
print(answer1) # 출력 테스트

4.3 sort() vs sorted()

4.3.1 sort()

- sort 함수는 리스트명.sort() 형식으로 "리스트형의 메소드"이며 리스트 원본값을 직접 수정합니다.

list1 = [3, 1, 2]
print("list1: ", list1)
list2 = list1.sort() # 원본을 정렬하고 수정합니다 (in-place)
print("=====정렬 후=====")
print("list1: ", list1)
print("list2: ", list2)

# 아래는 출력 값 입니다.

list1: [3, 1, 2]
=====정렬 후=====
list1 = [1, 2, 3]
list2 = None

4.3.2 sorted()

- sorted 함수는 sorted(리스트 명) 형식으로 "내장 함수"이며 리스트 원본 값은 그대로이고 정렬 값을 반환합니다.

list1 = [3, 1, 2]
print("list1: ", list1)
list2 = list1.sorted() # 원본을 유지하고 정렬한 새 리스트를 생성합니다.
print("=====정렬 후=====")
print("list1: ", list1)
print("list2: ", list2)

# 아래는 출력 값 입니다.

list1: [3, 1, 2]
=====정렬 후=====
list1 = [3, 1, 2]
list2 = [1, 2, 3]

위의 코드는 처음에 야매로 풀긴 풀었는데 append가 있는줄 몰라 엄청 해메면서 풀었던 코드다. 이 코드가 6줄로 변할 수 있다는 점이 진짜 놀랍다 파이썬,,,, 빨리 공부해서 쓰임좀 언능 알아야지

profile
삽질의 기록들🐥

관심 있을 만한 포스트

0개의 댓글