2 minute read

백준 문제 중 10871번

https://www.acmicpc.net/problem/10871

문제

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

출력

X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.


풀이

문제를 보고 처음 생각대로 작성했던 코드

n, x = map(int, input().split())

numbers = [None]*n

numbers = list(map(int, input().split()))
answers = filter(lambda number: number<x, numbers)


for answer in answers:
    print(answer,end=" ")
5 4
1 3 5 7 9
1 3 

위 코드로 알고리즘 테스트는 성공 했지만 만족스럽지 않아서 조금 더 살펴보았습니다

Issue1

map,filter와 iterator

n, x = map(int, input().split())

numbers = [None]*n

numbers = map(int, input().split())
answers = filter(lambda number: number<x, numbers)
print(numbers)

for answer in answers:
    print(answer,end=" ")
5 4
1 3 5 7 9
<map object at 0x7f40eae4bc10>
1 3 

map이 반환하는 iterator 개념이 헷갈렸고 list() 함수를 삭제하고 numbers를 출력해봤습니다

https://wikidocs.net/22802 generator https://wikidocs.net/22803 map, filter

위 링크에서 generator 와 iterator의 개념과 차이 그리고 map, filter 가 반환값이 iterator인 이유가 메모리를 더 효율적으로 쓰기 위해서임을 학습했습니다. 이 내용을 추후에 다른 글에서 다루겠습니다.

n, x = map(int, input().split())

numbers = map(int, input().split())
answers = filter(lambda number: number<x, numbers)

for answer in answers:
    print(answer,end=" ")
5 4
1 2 3 4 5 6 7 8 9 10
1 2 3 

Issue2

리스트 길이제한

n, x = map(int, input().split())

numbers = [None]*n

numbers = map(int, input().split())
answers = filter(lambda number: number<x, numbers)


for answer in answers:
    print(answer,end=" ")
1 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 

” [None]*n “이 의도대로 배열의 길이를 제한하지 않고 input 길이와 무관하게 코드가 동작함

# 의도한 리스트 길이제한
n = int(input())
test = [None]*n
print(test)
test[n+1] = n+1
5
[None, None, None, None, None]



---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-75-25e388674020> in <module>()
      3 test = [None]*n
      4 print(test)
----> 5 test[n+1] = n+1


IndexError: list assignment index out of range
#리스트의 참조 자체가 바뀌면서 원하지 않는 issue가 발생
n = int(input())
test1 = [None]*n
test2 = [None]*n+[n+1]

print(test1)

test1 = test2
print(test1)
5
[None, None, None, None, None]
[None, None, None, None, None, 6]

내가 의도한것과 달리 numbers에 map()을 직접 대입함으로서 리스트의 참조가 바뀌고 문제가 생김

Issue2-Solution1

#슬라이싱을 이용해 길이제한
n, x = map(int, input().split())

numbers = list(map(int, input().split()))
numbers = numbers[:n]
answers = filter(lambda number: number<x, numbers)
print(numbers)

for answer in answers:
    print(answer,end=" ")
3 4
9 1 2 3 4 5 6 7 8
[9, 1, 2]
1 2 

테스트속도 72ms 메모리 29964kb

Issue2-Solution2


#numbers의 참조를 바꾸지 않고 inputs리스트 추가
n, x = map(int, input().split())

numbers = [None]*n

inputs = list(map(int, input().split()))

for i in range(n):
    numbers[i] = inputs[i]
print(numbers)
answers = filter(lambda number: number<x, numbers)


for answer in answers:
    print(answer,end=" ")
3 4
9 1 2 3 4 5 6 7 8
[9, 1, 2]
1 2 

배운점

  1. generator와 iterator개념 map, filter 반환값
  2. 리스트를 다룰때 의도치 않게 참조값 자체가 변하는 지점 잘 생각하기
  3. 타 언어 array와 파이썬 list의 차이 에서 학습했고 추후에 따로 다룰것

Leave a comment