2019. 6. 9. 22:49ㆍ백준/Python
*문제에 대한 내 생각
본 문제에 앞선 2750은 사실상 프로그래밍 예제에 불과할 정도로 쉬웠다.
그러나 주어지는 수의 개수와 범위의 차이가 해당 문제의 난이도를 급상승시켰다.
찾아보니 정렬알고리즘을 적용시켜 푼 사람들이 많았는데, 솔직히 무슨 말인지 모르겠음.
(http://ejklike.github.io/2017/03/04/sorting-algorithms-with-python.html 가 그나마 설명을 잘 해놓았다.)
애초에 이걸 파이썬으로 하니까 느려터졌...지...
*문제 풀이
-아이디어
내가 처음 시도했던건 sort를 사용하는 것이었는데, 당연히 시간초과가 떴다. 아무래도 개수가 많다보니
정렬에 시간이 오래걸리는 듯 하다.
그래서 든 생각은 전체 input의 리스트를 나눠서 정렬하는 것이었다.
한번에 정렬하는 것이 오래걸린다면, 여러개로 나눠서 sort를 사용하면 가능할 것이라는 판단이었다.
-코드1
주어지는 input이 짝수인지 홀수인지에 따라 리스트를 구별했다.
예외처리를 한 이유는 리스트의 원소가 다 없어져 버리면 IndexError가 나와서 그렇다.
import sys
n = int(input())
odd = [] #홀수의 경우
notodd = [] #짝수의 경우
for i in range(n):
sample = int(sys.stdin.readline())
if sample%2 == 0:
notodd.append(sample)
else:
odd.append(sample)
odd.sort(reverse=True) #내림차순
notodd.sort(reverse=True)
try:
for i in range(n):
if odd[-1] < notodd[-1]:
print(odd.pop())
else:
print(notodd.pop())
except: #한 리스트가 비게되어 IndexError가 나는 경우
if len(odd) == 0:
for i in range(len(notodd)):
print(notodd.pop())
else:
for i in range(len(odd)):
print(odd.pop())
-코드2
이후 생각난 방법으로, 홀수짝수가 아니라 주어질 input의 개수들을 반으로 나눠서 정리하는 방법이다.
즉, n개가 주어지면 각 리스트에 n/2씩 집어넣어 sort를 사용한다.
결국 리스트에 넣는 정보들의 개수를 제외하고는 전부 같은 방식이다.
import sys
n = int(input())
sample1 = []
sample2 = []
for i in range(n):
sample = int(sys.stdin.readline())
if i%2 == 0: #i가 짝수인 경우
sample1.append(sample)
else:
sample2.append(sample)
sample1.sort(reverse=True)
sample2.sort(reverse=True)
try:
for i in range(n):
if sample1[-1] < sample2[-1]:
print(sample1.pop())
else:
print(sample2.pop())
except:
if len(sample1) == 0:
for i in range(len(sample2)):
print(sample2.pop())
else:
for i in range(len(sample1)):
print(sample1.pop())
*결과
코드1의 경우 557바이트에 1924ms, 코드2는 591바이트에 1952ms가 나왔다.
딱히 별 차이가 없어보인다.
참고로 리스트를 3개이상으로 늘렸을때가 궁금했지만 코드로 구현을 못해서 시도를 못해봤다.
(추가로 재미삼아 input을 랜덤으로 sample1과 sample2에 넣도록 해보니 3652ms가 나옴. 근데 이게 되네...)
'백준 > Python' 카테고리의 다른 글
[Python] 백준 2555 (생일) (0) | 2019.07.02 |
---|---|
[Python] 백준 2869 (달팽이는 올라가고 싶다) (3) | 2019.06.11 |
[Python] 백준 1032 (명령 프롬프트) (0) | 2019.06.11 |
[Python] 백준 15873 (공백 없는 A+B) (0) | 2019.06.11 |