X보다 작은 수
문제는 다음과 같습니다.
정수 N개로 이루어진 수열 A와 정수 X가 첫째 줄에 주어집니다.
둘째 줄에는 수열 A를 이루는 정수 N개가 주어집니다.
N의 범위가 10,000 입니다. 이는 리스트의 길이가 10,000이 될 수도 있고 만약 범위가 더 커졌다면 , 시간복잡도를 고려해서 코드를 작성해야 합니다. 이 문제에서는 그런 제한이 없지만, 최대한 시간복잡도를 아낄 수 있는 방법으로 작성해보겠습니다.
리스트를 받자마자 X보다 작은 수를 고려한다면 이는 O(N)만큼 소요됩니다. 하지만 백준 입력 예시에서는 리스트를 한번에 받게 끔 되어있습니다. 따라서 리스트를 받는것 까지는 이전 게시물에서 올린 방식 그대로 동일 합니다.
다만 이제부터는 가독성 또한 고려하겠습니다.
리스트 컴프리헨션
리스트 컴프리헨션은 복잡한 for 문 보다는 더욱 간단하고 가독성 있게 코드를 작성할 수 있습니다. 또한 if 문 까지 활용해도 한 문장으로 끝낼 수 있습니다.
N,M = map(int,input().split())
L1 = list(map(int,input().split()))
print(" ".join(map(str,[answer for answer in L1 if answer<M])))
여기서 리스트 컴프리헨션 부분은 아래와 같습니다.
[answer for answer in L1 if answer<M]
for answer in L1 -> L1을 answer에 하나씩 전달하면서 만약 answer가 M보다 작다면 answer를 리스트에 넣겠다 라는 의미입니다. 리스트컴프리헨션은 꼭 리스트로 감싸줘야 합니다. 만약 그렇지 않으면 제네레이터 형식이 되어서 출력해도 나오지 않은 객체가 됩니다. 이는 가비지컬렉터에 의해서 필요 할 때 만 호출되며 메모리 낭비를 줄이기 위함입니다. 제네레이터 형식을 출력하기 위해서는 groupby_ 를 출력하기 위한 방식 처럼 앞에 집계함수를 적용하는 것 입니다.
Generator 방식으로 적용됨을 알 수 있었습니다.
최종코드
N,M = map(int,input().split())
L1 = list(map(int,input().split()))
print(" ".join(map(str,[answer for answer in L1 if answer<M])))
'BaekJoon Reivew' 카테고리의 다른 글
단계별로 풀어보기 백준_2562번 (0) | 2025.03.18 |
---|---|
단계별로 풀어보기 백준_10818번 (0) | 2025.03.18 |
단계별로 풀어보기 백준_10807번 (0) | 2025.03.17 |
단계별로 풀어보기 백준_10951번 (0) | 2025.03.17 |
단계별로 풀어보기 백준_10952번 (0) | 2025.03.17 |