1. 백준 2751, 수 정렬하기 2
https://www.acmicpc.net/problem/2751
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
2. 요구사항
- 첫번째 입력값 N은 몇개의 수가 입력되는 지를 정한다.
- N개의 수가 입력되고 나면 이를 오름차순으로 정리해야 한다.
3. 어떻게 풀어야 할까?
- int(input())으로 첫번째 입력값 N을 받는다.
- map을 이용하여 N개의 input을 배열로 정리한다.
- N개의 요소를 갖는 배열을 오름차순으로 정렬한다.
- 1개씩 출력한다.
a) 내가 생각한 코드
n = int(input())
array = []
for _ in range(n):
userInput = int(input())
array.append(userInput)
array.sort()
for data in array:
print(data)
b) 제출결과

c) 왜 그럴까?
- pypy3로 제출한 경우 맞았다고 나오지만, python3로 제출했더니 틀렸다고 나온다.
- 아마도, 메모리 효율성의 측면에서 차이점이 있기 때문일 것이다,
- python은 더 적은 메모리를 사용한다. 반면에 pypy의 경우, 더 많은 메모리를 사용한다.
- 더 자세한 차이점에 대해서 알고 싶다면 아래의 링크를 참고하자.
https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4
Python3 와 PyPy3 차이
Python3 와 PyPy3 차이 평소에 알고리즘 문제를 풀면서 Python을 지원하는 언어를 선택할 때, Python3와 PyPy3가 대표적으로 있었다. 원래 알던 개념은 PyPy3가 Python3의 실행시 시간이 매우 오래 걸린다는
ralp0217.tistory.com
몸소 겪었던 Python과 PyPy의 차이(메모리,속도)
목차 무엇을 경험했나? 백준 2263 트리 문제를 풀면서 경험했던 것을 공유하려 합니다. RecursionError sys.setrecursion(10**5) //pypy3에서는 정답, python3에서는 recursionError sys.setrecursion(10**6) //p..
imksh.com
4. 해설 및 정답코드
- N이 최대 1,000,000까지의 범위를 갖고 있다.
- 그러므로 시간복잡도 O( N log N)의 정렬 알고리즘을 사용해야 한다.
- 고급 정렬 알고리즘(병합, 퀵, 힙 정렬 등)을 이용하여 해결할 수 있다.
- 여기서는 병합 정렬을 이용하여 문제를 풀어볼 것이다.


def merge_sort(array):
if len(array) <= 1:
return array
mid = len(array) // 2 # 배열의 중간 index를 찾는다
left = merge_sort(array[:mid]) #중간 index를 기점으로 좌우측을 나눈다
right = merge_sort(array[mid:]) # 재귀함수를 사용하는 이유는 완벽하게 정렬될 때까지 계속 정렬되도록 하기 위함이다.
i, j, k = 0, 0, 0 # i는 좌측, j는 우측 배열의 index 값을 의미한다. k는 완성될 배열의 index 값이다.
while i < len(left) and j < len(right):
if left[i] < right[j]: # 좌우측 배열의 값을 비교한다.
array[k] = left[i] # 비교했을 때, 더 작은 값이 array에 삽입된다.
i += 1 # 좌측 배열의 값이 더 작아서 array에 삽입됐다면, 다음 좌측 원소과 우측 원소의 값을 비교한다.
else: # 우측 배열의 값이 더 작은 경우,
array[k] = right[j] # 우측 배열의 값이 array에 삽입된다.
j += 1 # 다음 우측 원소의 값과 좌측 배열의 원소 값을 비교하기 위해 index값을 증가한다.
k += 1 # 위의 if 또는 else 문을 거쳤다면, array[k]에는 원소가 삽입되기에 다음 자리로 이동하기 위해 index 값을 증가한다.
if i == len(left): # 좌측 배열에 더이상 비교할 원소가 없는 경우
while j < len(right):
array[k] = right[j]
j += 1
k += 1
elif j == len(right):
while i < len(left):
array[k] = left[i]
i += 1
k += 1
return array
n = int(input())
array = []
for _ in range(n):
array.append(int(input()))
array = merge_sort(array)
for data in array:
print(data)
'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글
백준 2839번, 파이썬 - 설탕배달 (0) | 2021.08.11 |
---|---|
오늘의 알고리즘(백준 11004) (0) | 2021.07.23 |
오늘의 알고리즘(백준 7490) (0) | 2021.07.22 |
오늘의 알고리즘(5월 5일) (0) | 2021.05.05 |
오늘의 알고리즘(5월 4일) (0) | 2021.05.04 |
댓글