Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

바닥부터 시작하는 개발 공부

[알고리즘]백준 1235 : 학생 번호 본문

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
Comments