코딩테스트/SW Expert Academy

[D3] 1221. [S/W 문제해결 기본] 5일차 - GNS

2024. 10. 23. 11:02

1221. [S/W 문제해결 기본] 5일차 - GNS

 

✏️ 문제 풀이

- 특정 단어를 숫자로 변환하여 정렬한 후, 정렬된 결과 출력 

- _, n (#기호와 테스트 케이스 번호, 길이)를 입력받음

→ _는 필요 없는 값을 무시하기 위해 사용 

 

버킷 정렬

- 데이터를 여러 개의 "버킷"에 나누어 저장한 후, 각 버킷을 개별적으로 정렬하고 마지막에 모든 버킷을 합치는 방식

- 각 숫자(0~9)에 해당하는 단어들을 buckets 리스트의 인덱스에 저장함으로써, 자연스럽게 정렬된 상태 유지

→ buckets는 10개의 빈 리스트를 포함하는 리스트 

ex) buckets[0], buckets[1], ..., buckets[9]는 각각 빈 리스트로 시작 

- dic: 단어와 해당 숫자 간의 매핑을 정의하는 딕셔너리(단어를 숫자로 변환하는 데 사용)

 

- arr에 있는 각 단어에 대해 반복

→ dic[word]를 사용하여 해당 단어가 어떤 숫자에 매핑되는지를 찾고, 그 숫자를 인덱스로 하여 buckets의 해당 리스트에 단어 추가

ex) "ZRO"가 arr에 있다면, buckets[0]에 "ZRO" 추가

 

- buckets의 각 서브리스트에 대해 반복하며, 각 서브리스트에 저장된 단어들을 공백으로 구분하여 출력

- end=" "는 각 서브리스트의 출력이 끝난 후 줄바꿈 없이 공백으로 이어지도록 함.

T = int(input())
for tc in range(1, T + 1):
    _, n = input().split()  # 테스트 케이스 번호와 길이 입력
    arr = list(input().split())  # 단어 목록 입력
    buckets = [[] for _ in range(10)]  # 0~9까지의 숫자를 인덱스로 하는 리스트 초기화
    dic = {
        "ZRO": 0,
        "ONE": 1,
        "TWO": 2,
        "THR": 3,
        "FOR": 4,
        "FIV": 5,
        "SIX": 6,
        "SVN": 7,
        "EGT": 8,
        "NIN": 9
    }

    # 각 단어를 해당하는 숫자 인덱스에 추가
    for word in arr:
        buckets[dic[word]].append(word)

    print(f"#{tc}") 
    for sublist in buckets:  # 각 숫자 인덱스에 저장된 단어 출력
        print(" ".join(sublist), end=" ")

 

sorted() 함수 사용

- sorted() 함수를 사용하여 arr 리스트의 각 요소에 대해 람다 함수를 호출하여 그 결과(숫자)를 얻음 

→ 이 숫자들을 기준으로 리스트의 각 요소들이 정렬됨 

 

- key 매개변수: 정렬 기준을 정의하는 함수

→ 리스트의 각 요소에 대해 호출되며, 반환된 값에 따라 정렬이 이루어짐

- lambda x: dic[x]: 익명 함수

→  입력값 x를 받아서 dic 딕셔너리에서 해당 단어에 대한 숫자 반환

 

ex) 입력 배열 arr이 아래와 같다고 가정

arr = ["ONE", "ZRO", "TWO", "SVN", "FOR"]

 

정렬 과정에서 각 단어는 다음과 같이 변환
"ONE" → 1
"ZRO" → 0
"TWO" → 2
"SVN" → 7
"FOR" → 4

 

이를 바탕으로 정렬하면 다음과 같은 순서
"ZRO" (0)
"ONE" (1)
"TWO" (2)
"FOR" (4)
"SVN" (7)

 

최종 정렬

["ZRO", "ONE", "TWO", "FOR", "SVN"]

T = int(input())
for tc in range(1, T + 1):
    _, n = input().split()  
    arr = list(input().split())  
    dic = {
        "ZRO": 0,
        "ONE": 1,
        "TWO": 2,
        "THR": 3,
        "FOR": 4,
        "FIV": 5,
        "SIX": 6,
        "SVN": 7,
        "EGT": 8,
        "NIN": 9
    }

    # 단어를 숫자에 따라 정렬
    sorted_arr = sorted(arr, key=lambda x: dic[x])

    print(f"#{tc}") 
    print(" ".join(sorted_arr))