Algorithm/백준
[알고리즘]백준 1235 : 학생 번호
Im_light.J
2023. 2. 24. 03:30
728x90
알고리즘 유형: 자료 구조(해쉬)
문제
이번에는 학생들을 더욱 효율적으로 관리하기 위해 학생마다 고유한 학생 번호를 부여하기로 하였다. 학생 번호는 0부터 9 사이의 숫자로 이루어진 문자열로, 모든 학생들의 학생 번호는 서로 다르지만 그 길이는 모두 같다.
학생들의 번호를 부여해 놓고 보니, 김진영 조교는 어쩌면 번호가 지나치게 긴 것은 아닌가 싶은 생각이 들었다. 예를 들어 아래와 같은 7자리의 학생 번호를 보자.
이름번호오민식 | 1212345 |
김형택 | 1212356 |
이동호 | 0033445 |
이처럼 학생 번호를 굳이 7자리로 하지 않고, 뒤에서 세 자리만을 추려서 남겨 놓아도 모든 학생들의 학생 번호를 서로 다르게 만들 수 있다.
이름번호오민식 | 345 |
김형택 | 356 |
이동호 | 445 |
하지만 세 자리보다 적게 남겨 놓아서는 모든 학생들의 학생 번호를 서로 다르게 만들 수 없다.
학생들의 번호가 주어 졌을 때, 뒤에서 k자리만을 추려서 남겨 놓았을 때 모든 학생들의 학생 번호를 서로 다르게 만들 수 있는 최소의 k를 구하는 프로그램을 작성하시오.
입력
첫째 줄에는 학생의 수 N(2≤N≤1,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 학생의 학생 번호가 순서대로 주어진다. 모든 학생들의 학생 번호는 서로 다르지만 그 길이는 모두 같으며, 0부터 9 사이의 숫자로 이루어진 문자열이 주어진다. 문자열의 길이는 100보다 작거나 같다.
출력
첫째 줄에 구하고자 하는 가장 작은 k값을 출력한다.
풀이
import sys
from collections import defaultdict
dict =defaultdict(int)
N =int(sys.stdin.readline().strip())
nums=[]
for i in range(N):
num =sys.stdin.readline().strip()
nums.append(num)
i=1
while len(dict.keys())!=len(nums):
for num in nums:
dict[num[::-1][:i]]+=1
#숫자들을 뒤집어 거꾸로 i만큼의 자리수를 잘라 키로 딕셔너리에 집어넣습니다
if dict[num[::-1][:i]]==2:
#이때 키에 해당하는 밸류가 2면, 중복된 값이 존재한다는 의미이므로 딕셔너리를 초기화하고
#i를 1 추가해줍니다
dict =defaultdict(int)
i+=1
break
print(i)
728x90