P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다.
배열 A가 주어졌을 때, 수열 P를 적용한 결과가 비내림차순이 되는 수열을 찾는 프로그램을 작성하시오. 비내림차순이란, 각각의 원소가 바로 앞에 있는 원소보다 크거나 같을 경우를 말한다. 만약 그러한 수열이 여러개라면 사전순으로 앞서는 것을 출력한다.
위 문제는 배열 A를 비내림차순 수열을 출력하는 것이다.
직접 예제를 보면서 문제를 이해하는 것이 편하다.
첫째줄에 배열 A의 크기 N을 받고,
둘째줄에는 배열 A의 원소가 주어진다고 하였다.
3
2 3 1
1 2 0
가장 쉽게 설명하자면,
입력을 받은 숫자들 중에 각 숫자가 몇 번째로 큰 지 인덱스로 나타내면 된다.
즉, 입력값을 오름차순으로 정렬한 다음 해당 인덱스를 출력하면 된다.
index | 1 | 2 | 0 |
---|---|---|---|
input | 2 | 3 | 1 |
입력값 2 3 1 중에서 2는 2번째로 가장 크다.
따라서 인덱스는 2번째 큰 1을 부여받으면 된다.
import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
sortA = sorted(A,reverse=False)
P = []
for i in range(N):
P.append(sortA.index(A[i]))
sortA[sortA.index(A[i])] = -1
for i in range(N):
print(str(P[i]),end=' ')
input은 내장 함수인 input()을 써도 될 거 같긴 하다.
나는 그냥 습관이 이렇게 잡혀서 ..ㅎ ㅎ..
첫 번째로 입력 배열의 크기인 N을 정수형으로 받았다.
두 번째 줄에는 A라는 리스트에 입력 수열을 담았다.
이후, sorted 함수를 이용하여 새롭게 오름차순으로 정렬한 리스트
sortA 를 만들었다.
수열은 N개만큼의 크기이기에 for문으로 N개만큼 돌려가며
입력 받은 배열 A의 각 요소들이 정렬된 배열에서 몇 번째 index인지 확인하였다.
해당 값을 이후 P라는 정답 배열에 추가해주었다.
이후, 리스트 형태로 값을 저장했기에 각 요소 하나씩 str형으로 변환해주며
출력할 수 있도록 하였다.
처음 velog에 풀이를 공유하겠다 마음을 먹으며 이 문제를 풀게 되었다.
구현보다 문제 이해가 더 어려웠던 것 같다.
다른 분들의 풀이도 찾아보고 문제 이해도 해보려 했지만,
결국 내가 생각했던 방식 말고는 다른 방식으로 이해하기는 실패하였다.
입출력 예시가 많이 없으면 힘들겠지만
입출력 예시가 많으면 해당 예시를 보면서 문제를 이해하는 방식도
나쁘진 않을 것 같다.
혹시 이상한 점이 있는 것을 발견하신 분은 꼭 알려주십시오 .. ㅜ ㅜ
많이 부족한 사람입니다 😅