[백준]#5052 Python
백준 5052번 - 전화번호 목록
https://www.acmicpc.net/problem/5052
전체 코드
import sys
input = sys.stdin.readline
def consistency(array):
for i in range(len(array)-1):
compare = array[i][0]
compare_length = array[i][1]
for s in range(i+1, len(array)):
check = True
idx = 0
while idx < compare_length:
if array[s][0][idx] == compare[idx]:
idx += 1
else:
check = False
break
if check:
return False
return True
t = int(input())
for i in range(t):
n = int(input())
ph = []
for s in range(n):
num = input().rstrip('\n')
ph.append((num, len(num)))
ph = sorted(ph, key=lambda x: x[1])
if consistency(ph):
print('YES')
continue
else:
print('NO')
continue
사실 Python3로 돌리니 시간초과가 나온 코드이다,,, 다행히 Pypy3로 돌리니 맞았다고는 뜨지만 여전히 기분히 찜찜하긴 하다.
접근법
- 전화번호를 길이 순서로 정렬해준다.
- 이중 for 문으로 서로 다른 두개의 전화번호를 선택해서 비교 -> 이 부분에서 시간초과가 나지 않았나 싶다.
- 같은 인덱스의 숫자가 같으면 인덱스값 증가, 다르면 다음 전화번호로 넘어간다.
- while 문을 통과해서 check 가 True 인 채로 넘어가면 해당 전화번호가 다른 전화번호에 포함되어 있다는 말이므로 함수 종료.
모범답안
import sys
input = sys.stdin.readline
t = int(input())
def check():
for i in range(len(a)-1):
if a[i] == a[i+1][0:len(a[i])]:
print('NO')
return
print('YES')
for _ in range(t):
n = int(input())
a = []
for i in range(n):
a.append(input().strip())
a.sort()
check()
느낀점
문자열을 정렬시키면 사전순으로 배열, 사전 순에 구애받지 않는 경우 길이가 짧은 숫자가 먼저 배열. 따라서 이 문제에서는 배열만 시키면 i, i+1 끼리만 비교해주면 된다.
Author And Source
이 문제에 관하여([백준]#5052 Python), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@enchantee/백준5052-python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)