https://www.acmicpc.net/problem/1377
1377번: 버블 소트
첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,000보다 작거나 같은 자연수 또는 0이다.
www.acmicpc.net
처음엔 문제에 나와있는 코드를 그대로 구현해봤는데, 시간초과가 났다. 버블정렬은 O(n^2)의 시간복잡도를 가지기 때문이다.
import sys
N = int(sys.stdin.readline())
A = [-1]
for _ in range(N):
A.append(int(sys.stdin.readline()))
for i in range(1, N+2):
change = False
for j in range(1, N-i+1):
if (A[j] > A[j+1]):
change = True
A[j], A[j+1] = A[j+1], A[j]
if (change==False):
print(i)
break
검색을 통해 힌트를 좀 얻었는데, 버블 정렬은 한 번 훑으면서 A[j]>A[j+1]인 A[j+1]가 앞으로 한 칸씩 swap 된다.
따라서 정렬 후의 인덱스와 정렬 전의 인덱스를 비교해서 차이가 가장 큰 수만큼 i가 늘어났다고 생각할 수 있다.
import sys
N = int(sys.stdin.readline())
A = []
for i in range(N):
a = int(sys.stdin.readline())
A.append([a,i])
A.sort()
ans = 0
for i in range(N):
tmp = A[i][1] - i
ans = max(ans, tmp)
print(ans+1)
'알고리즘💻 > 이분탐색&정렬&분할정복' 카테고리의 다른 글
BOJ 18113번: 그르다 김가놈 (0) | 2021.08.05 |
---|---|
BOJ 1074번: Z (0) | 2021.08.05 |
BOJ 11582번: 치킨 TOP N (0) | 2021.07.19 |
BOJ 1448: 삼각형 만들기 (0) | 2021.07.19 |
BOJ 10825번: 국영수 (0) | 2021.07.18 |