728x90
이번 포스트에서는 CodeUp의 3004번 "데이터 재정렬" 문제를 풀어보겠다.
문제 설명은 다음과 같다.
입력과 출력은 다음과 같다.
## 문제 해석:
우선 처리할 데이터의 개수를 입력 받는다. 그런 다음에 입력받은 개수를 기반으로 각 데이터를 입력받는다. 마지막으로 각 데이터의 크기 인덱스를 출력하면 된다.
## 문제 풀이:
먼저 처리할 데이터의 수를 입력 받는 코드를 작성한다. 값의 범위를 검증하는 코드도 역시 추가한다.
n = int(input())
if n < 1 or n > 50000:
print("n의 범위는 1~50000이다.")
quit()
그런 다음에 입력한 데이터의 수를 바탕으로 각 데이터를 입력받는 코드를 작성한다.
n = int(input())
if n < 1 or n > 50000:
print("n의 범위는 1~50000이다.")
quit()
data = list(map(int, input().strip().split()))
if len(data) != n:
print(f"{n}개의 데이터를 삽입하시오.")
quit()
이제 각 데이터의 순서 인덱스를 구해야 하는데, 여기서는 이진탐색법을 사용해서 시간 복잡도를 최대한 줄여보는 방식으로 구해보겠다.
def binarysearch(data, target, first, last):
if first > last:
return 1
mid = int((first + last) / 2)
if data[mid] == target:
return mid
elif data[mid] > target:
return binarysearch(data, target, first, mid-1)
else:
return binarysearch(data, target, mid+1, last)
n = int(input())
if n < 1 or n > 50000:
print("n의 범위는 1~50000이다.")
quit()
data = list(map(int, input().strip().split()))
if len(data) != n:
print(f"{n}개의 데이터를 삽입하시오.")
quit()
## 최종 코드:
def binarysearch(data, target, first, last):
if first > last:
return 1
mid = int((first + last) / 2)
if data[mid] == target:
return mid
elif data[mid] > target:
return binarysearch(data, target, first, mid-1)
else:
return binarysearch(data, target, mid+1, last)
n = int(input())
if n < 1 or n > 50000:
print("n의 범위는 1~50000이다.")
quit()
data = list(map(int, input().strip().split()))
if len(data) != n:
print(f"{n}개의 데이터를 삽입하시오.")
quit()
sorted_data = sorted(data)
for i in range(n):
print(binarysearch(sorted_data, data[i], 0, n-1), end=" ")
## 실행 결과:
'Coding Test > CodeUp' 카테고리의 다른 글
CodeUp-3016 (1등 한 학생의 성적) (1) | 2023.03.06 |
---|---|
CodeUp-3015 (성적표 출력) (0) | 2023.03.05 |
CodeUp-2623 (최대공약수 구하기) (0) | 2023.03.03 |
CodeUp-4012 (석차 계산) (0) | 2023.03.02 |
CodeUp-1805 (입체기동장치 생산공장) (0) | 2023.03.01 |