정답 비율과 푼사람이 적었지만 문제 해결 알고리즘은 쉽게 생각나서 이 문제를 골랐지만 의외로 복잡했고, 코드가 지저분해졌었다. 그래서 다른 사람의 도움을 얻어보려 열심히 구글링을 해봤지만 맞힌 사람이 63명 밖에 없었고(2022.4.18기준) 파이썬으로 풀이를 적어둔 사람은 한명도 보지 못했다...ㅎㅎ
📘풀이
1. 입력된 단어들을 사전순으로 정렬한다. 이때 인덱스도 같이 저장해준다.
2. 정렬된 단어들을 한글자씩 비교해가면서 접두사의 길이가 최대인 경우를 찾는다.
3. 접두사의 길이가 최대이면서 가장 먼저 입력된 단어를 출력한다.
💻코드
n = int(input())
a = [input() for _ in range(n)]
# n = 9
# a = ["noon", "is", "for","lunch","most","noone","waits","until","two"]
# 입력받은 문자들을 인덱스와 함께 사전순으로 정렬한다.
b = sorted(list(enumerate(a)),key = lambda x: x[1])
# b = [(2, 'for'), (1, 'is'), (3, 'lunch'), (4, 'most'), (0, 'noon'), (5, 'noone'), (8, 'two'), (7, 'until'), (6, 'waits')]
# check 함수는 글자 하나하나가 서로 같은지 탐색
def check(a, b):
cnt = 0
for i in range(min(len(a), len(b))):
if a[i] == b[i]: cnt += 1
else: break
return cnt
# 최장 접두사를 가진 문자열 담아둘 리스트 생성
length = [0] * (n+1)
maxlength = 0
for i in range(n-1):
# 인접한 두개의 문자열을 check함수에 대입
# tmp 값은 동일한 접두사의 길이
tmp = check(b[i][1], b[i+1][1])
# 최장 접두사 길이 갱신
maxlength = max(maxlength, tmp)
# b[i][0]은 문자가 입력된 순서, 즉 인덱스
# length 에 입력된 순서에 자기 접두사 길이를 저장
# max 함수로 이전 값하고 현재 값하고 비교하여 집어넣음
length[b[i][0]] = max(length[b[i][0]], tmp)
length[b[i+1][0]] = max(length[b[i+1][0]], tmp)
# length = [4, 0, 0, 0, 0, 4, 0, 0, 0, 0]
first = 0
for i in range(n):
# 입력된 순서대로 접두사의 길이 비교
if first == 0:
# 만약 현재 접두사의 길이가 최장접두사라면
if length[i] == max(length):
# 제일 먼저 입력된 문자 출력
first = a[i]
print(first)
pre = a[i][:maxlength]
else:
# 다음으로 입력되었된 값들 중 최장 접두사 출력후 종료
if length[i] == max(length) and a[i][:maxlength] == pre:
print(a[i])
break
📎문제링크: https://www.acmicpc.net/problem/2179
'Problem Solving > 백준' 카테고리의 다른 글
[백준] 16165번: 걸그룹 마스터 준석이 - 파이썬 (0) | 2022.04.22 |
---|---|
[백준] 1037번: 약수 (0) | 2022.04.20 |
[백준] 1010번: 다리 놓기 (0) | 2022.04.17 |
[백준] 1924번: 2007년 (0) | 2022.04.14 |
[백준] 5397번: 키로거 (0) | 2022.04.12 |