본문 바로가기
Problem Solving/BOJ

[BOJ][Python]1015 풀이

by NoiB 2023. 6. 27.
반응형

https://www.acmicpc.net/problem/1015

 

1015번: 수열 정렬

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다. 배열 A가 주

www.acmicpc.net

n = int(input())
tmp = list(map(int, input().split()))
a = [(tmp[i], i) for i in range(n)]
a_s = sorted(a, key=lambda x:x[0])
for i in range(n):
    for j in range(n):
        if a[i][1] == a_s[j][1]:
            print(j, end=' ')
            break

예전에 이런 비슷한 문제를 풀었던 적이 있어서 잘못 넘겨짚는 바람에 오히려 헤맸네요. 수열이 어떻고 n이 어떻고 집중을 못하게 하는 말들이 있습니다만, 핵심은 입력으로 주어진 수열을 오름차순으로 정렬했을 때 원소들의 인덱스가 무엇인지 묻는 것입니다. 예시 1을 가지고 설명을 해보면 2 3 1이 나왔으니 2는 1번 인덱스로 가고, 3은 2번, 1은 0번으로 가야 오름차순으로 정렬이 되겠죠. 그래서 답이 1 2 0이 되는 겁니다. 이렇게 설명을 하긴 했지만 스스로에게 가장 잘 와닿는 말로 직접 정리를 해보면 더 좋을 것 같네요.

 

그래서 방금 한 말을 그대로 코드로 구현하면 위와 같은 코드가 됩니다. 원래 있던 위치를 컴퓨터에게 기억시키려면 뭔가 태그를 달아야 중복된 숫자가 나왔을 때도 구분할 수 있겠죠. 그래서 입력을 받은 이후에 태그를 다는 작업을 해줍니다. 그리고 오름차순으로 정리한 다음 정렬 전의 리스트와 정렬 후의 리스트에서 태그를 비교해서 같다면, 정렬 후의 리스트에서 해당 태그가 있는 인덱스를 출력하게 됩니다.

다만 짜놓고 보니까 너무 무식한 것 같아서 다른 분들 코드를 좀 살펴봤더니 제가 놓친 부분을 발견했습니다. 핵심은 같지만 코드를 좀 더 짧게 짤 수 있더라구요. 태그만 비교할 필요가 없으며, 굳이 이중반복문을 통해 인덱스를 출력시킬 필요가 없더라구요. 해당 사항을 반영해서 코드를 수정하면

n = int(input())
tmp = list(map(int, input().split()))
a = [(tmp[i], i) for i in range(n)]
a_s = sorted(a, key=lambda x:x[0])
for i in a:
    print(a_s.index(i), end=' ')

이렇게 정렬 전의 원소가 정렬 후에 인덱스가 뭔지 출력하면 되는 부분이었습니다. 아직 갈고 닦을 점이 한두가지가 아니네요. 

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]1004 풀이  (0) 2023.06.29
[BOJ][Python]4344 풀이  (0) 2023.06.28
[BOJ][Python]1094 풀이  (0) 2023.06.26
[BOJ][Python]1032 풀이  (0) 2023.06.25