ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 10431번 줄세우기
    Algorithm Study/Python 2024. 7. 17. 16:17

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

     

    풀이

    이 문제는 오름차순으로 insertion sort를 물어보는 문제와 동일하다. 새로 입력받은 숫자를 기존 리스트의 맨 끝 idx부터 비교하여
    입력받은 숫자보다 큰 경우 idx를 1칸씩 당겨가면서 비교한다.
    그리고 입력받은 숫자보다 작은 숫자가 나오면 그 뒤에 새로 입력받은 숫자를 삽입한다.
    이 경우 기존 숫자들은 1칸씩 밀리게 되기 때문에 이 때 이동이 발생하는 회수를 묻는 문제이다.

    문제의 테스트 케이스는 최대 1000개 입력 받는 숫자는 20이기 때문에 20*20*1000으로 400000정도 연산이 수행되기 때문에 위 방법으로 풀어도 요구 시간인 1초안에 풀 수 있게된다.

     

     

    data = list(map(int, input().split()))
    for j in range(2, 21):

    코드에서는 한번에 20개의 숫자를 입력받기 때문에 새로 입력받는 대신 list의 범위를 1씩 증가시켰다.
    처음 1개는 정렬된 상태로 판단하고 idx 2번부터 20번까지 정렬 (0번에는 test_case 번호가 들어있기 때문에 실제 데이터는 1~20)

     

            for k in range(j, 1, -1): 
                if data[k] < data[k-1]:
                    data[k], data[k-1] = data[k-1], data[k]
                    answer += 1

    현재 범위 j부터 2번 idx까지 검사하면서  현재 값이 이전 값보다 작으면 순서를 바꿔주었다. (이전 값까지 판별하기 때문에 범위는 2번 idx까지)
    순서가 바뀔때마다 answer을 1씩 증가해주면 된다.

     

     

    전체 코드

    n = int(input())
    
    for i in range(n):
        data = list(map(int, input().split()))
        answer = 0
        for j in range(2, 21):
            for k in range(j, 1, -1): 
                if data[k] < data[k-1]:
                    data[k], data[k-1] = data[k-1], data[k]
                    answer += 1
        print(f"{i+1} {answer}")

     

     

    Copilot 활용

    insertion sort는 단순하고 정확한 이름이 있는 알고리즘이기 때문에 copilot에게 insertion sort의 기본 예제를 만들어달라고 요청했다.

    def insertion_sort(arr):
        for i in range(1, len(arr)):
            key = arr[i]
            j = i - 1
            while j >= 0 and arr[j] > key:
                arr[j + 1] = arr[j]
                j -= 1
            arr[j + 1] = key
    
    # Example usage
    arr = [5, 2, 8, 12, 1]
    insertion_sort(arr)
    print("Sorted array:", arr)

    Copilot이 만들어준 코드는 예제가 이미 정해져있고 결과물 출력하는 부분이 다르기 때문에 해당 부분을 수정했다.

     

    def insertion_sort(arr, n):
        count = 0
        for i in range(1, len(arr)):
            key = arr[i]
            j = i - 1
            while j >= 0 and arr[j] > key:
                arr[j + 1] = arr[j]
                count += 1
                j -= 1
            arr[j + 1] = key
        print(f"{n+1} {count}")
    
    # Example usage
    n = int(input())
    for i in range(n):
        arr = list(map(int, input().split()))
        insertion_sort(arr[1:], i)

    n을 입력받아서 n번 데이터를 받으면서 만들어준 함수를 호출했고 결과물에 테스트 케이스 번호 + 정답을 출력하기 위해서
    함수 인자로 테스트 케이스 번호를 넣어줬다. (answer을 return 받아서 main에서 출력해도 상관없음)

     

    기존에 풀었던 코드보다 더 빠른 시간에 정답을 냈다. 
    확실히 어떻게 사용하냐에 따라서 더 쉽게 코드를 짤 수 있을 것 같다.

     

    'Algorithm Study > Python' 카테고리의 다른 글

    [백준] 16165번 걸그룹 마스터 준석이  (0) 2024.11.11
    [백준] 7785번 회사에 있는 사람  (0) 2024.11.10
    [백준] 1009번 설탕 배달  (0) 2024.07.11
    [백준] 2839번 설탕 배달  (0) 2024.07.01
    [백준] 1940번 주몽  (1) 2024.03.22

    댓글

From BlackHair