[문제]
https://www.acmicpc.net/problem/1599

요즘 코테를 보면 문자열 문제가 많이 출제되고 있는 거 같습니다.
특정 유형이 정해진 문제가 아니라면 아이디어로 구현하는 느낌이라 개인적으로 어렵게 다가오는 유형 중 하나입니다.
문제의 요지는 새로운 문자 체계를 기준에 맞게 정렬하는 문제입니다.
문자 정렬은 문자 하나하나의 아스키 값을 바탕으로 정렬하기 때문에, 새로운 문자 체계에 맞는 키 값을 매핑하는 방식으로 문제를 해결했습니다.
[초기화]
def __init__(self):
self.n = int(input())
self.words = [input() for _ in range(self.n)]
self.answer = []
(키, 값) 형태로 self.answer에 저장해 키를 기준으로 정렬할 것입니다.
[풀이]
def solve(self):
alphabet = ['a', 'b', 'k', 'd', 'e', 'g', 'h', 'i', 'l', 'm', 'n', 'ng', 'o', 'p', 'r', 's', 't', 'u', 'w', 'y']
priority = [i for i in range(1, 21)]
dic = dict((key, value) for key, value in zip(alphabet, priority))
for word in self.words:
data = []
i = 0
while i < len(word):
if word[i:i+2] == "ng":
data.append(dic["ng"])
i += 2
else:
data.append(dic[word[i]])
i += 1
self.answer.append((data, word))
for key, value in sorted(self.answer, key=lambda x: x[0]):
print(value)
새로운 문자를 하나씩 배치해서 순차적으로 키 값과 매핑해 하나의 딕셔너리를 생성합니다.
주어진 문자를 하나씩 꺼내오며 문자에 해당하는 키 값을 data에 순서대로 저장합니다.
이후 키 값들이 저장된 리스트를 새로운 키로 하여 self.answer에 저장해 해당 값을 기준으로 정렬해 출력합니다.
정렬은 각 리스트의 값을 순차적으로 비교해 나가며 값이 동일할 경우 다음 값을 비교하는 방식으로 진행됩니다.
[전체 코드]
class Main:
def __init__(self):
self.n = int(input())
self.words = [input() for _ in range(self.n)]
self.answer = []
def solve(self):
alphabet = ['a', 'b', 'k', 'd', 'e', 'g', 'h', 'i', 'l', 'm', 'n', 'ng', 'o', 'p', 'r', 's', 't', 'u', 'w', 'y']
priority = [i for i in range(1, 21)]
dic = dict((key, value) for key, value in zip(alphabet, priority))
for word in self.words:
data = []
i = 0
while i < len(word):
if word[i:i+2] == "ng":
data.append(dic["ng"])
i += 2
else:
data.append(dic[word[i]])
i += 1
self.answer.append((data, word))
for key, value in sorted(self.answer, key=lambda x: x[0]):
print(value)
problem = Main()
problem.solve()
문제를 보자마자 아스키 값 기준 정렬이 생각나서 위와 같이 풀어보았습니다.
그런데 다른 사람들의 풀이를 보니, replace를 이용해 원래 영어 체계로 맞춰 풀이를 진행하는 것을 확인할 수 있었습니다.
평소에 사용하지 않는 함수라 해당 방식을 떠올릴 생각을 못했는데, 역시 다른 사람들의 풀이를 보는 것이 인사이트를 넓힐 수 있어서 좋은 거 같습니다.