[D3] 1221. [S/W 문제해결 기본] 5일차 - GNS
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))