N = int(input())
lst = [input() for i in range(N)]
result = 0
num = len(lst[0]) # 학생 번호의 숫자의 갯수
# 학생 번호의 숫자의 갯수 - 1 만큼 반복
for i in range(1, num):
c = set() # set 집합
# len(lst)만큼 lst 내의 값을 불러와 반복
for e in lst:
# 뒤에서부터 i개씩 잘라서 c에 추가
c.add(e[-i:])
# 만약 c 집합 내의 원소의 갯수가 학생의 수와 같으면
if len(c) == N:
ans = i # 자른 숫자의 갯수인 i를 ans에 저장
break # 답을 구했으므로 for문 종료
print(ans)
import sys
lst = []
# 학생의 수 만큼 반복
for i in range(int(input())):
# 학생 번호를 입력받아 reverse를 취한 후 lst에 추가
lst.append(str(sys.stdin.readline().strip())[::-1])
# 학생 번호 숫자의 갯수만큼 반복
for i in range(1, len(lst[0]) + 1):
# lst에서 원소를 꺼내서 학생 번호의 숫자의 갯수를
# 앞에서부터 i개 만큼 잘라서 sub_lst에 넣음
sub_lst = list(map(lambda x: x[:i], lst))
# 만약 sub_lst의 길이와 set() 함수로 중복을 제거한
# sub_lst의 길이가 같다면
if len(sub_lst) == len(set(sub_lst)):
print(i) # 자른 학생 번호 숫자의 갯수인 i를 출력
break # for문 종료
solution 1
학생 번호의 숫자의 갯수 - 1만큼 for문을 돌린다. 이 때 학생 번호를 뒤부터 i개씩 잘라서 c에 추가하되set()
을 사용하여 c 집합에 추가되는 원소들이 중복되는 값이 없도록 한다. 내부 for문을 다 돈 후 c 집합이 만들어진 후에 c 집합 내의 원소의 갯수가 학생의 수와 같으면 중복으로 제거된 값이 없다는 뜻이므로 모든 학생들의 학생 번호를 서로 다르게 만들 수 있다다는 것을 의미한다. 그러므로 밖의 for문을 종료하고, 자른 숫자의 갯수인 i를 출력한다.
solution 2
처음에 input인 학생 번호를 받아올 때 숫자 그대로 받아오지 않고 역을 취한 값으로 받아와서 lst에 저장한다. 그 후 학생 번호 숫자의 갯수만큼 for문을 돌리고, lst에서 원소를 꺼내서 학생 번호의 숫자의 갯수를 앞에서부터 i개 만큼 잘라서 sub_lst에 넣는다. sub_lst가 완성된 후에 sub_lst의 길이와 sub_lst에 set() 함수를 취하여 서로의 길이를 비교한다. sub_lst에 set() 함수를 취하면 sub_lst 내의 중복 값이 제거되는데 이 때 sub_lst와 set(sub_lst)의 길이가 같다면 sub_lst 내에 중복되는 값이 없다는 것을 의미하므로 모든 학생들의 학생 번호를 서로 다르게 만들 수 있다는 것을 의미한다. 그러므로if len(sub_lst) == len(set(sub_lst))
가True
라면 자른 학생 번호 숫자의 갯수인 i를 출력한다.
sub_lst = list(map(lambda x: x[:i], lst))
위의 코드에 대해 부연 설명을 하자면
map
함수와lambda
함수가 사용된다.map
함수가 매개변수로 받은 함수는lambda x: x[:i]
이고, list는lst
로 받는다. 그리고map
함수는 lst에서 원소를 하나씩 꺼내서lambda
함수인 x[:i]에 대입하여 나온 결과값들을 새로운 list인sub_lst
에 저장한다. 즉, lst 내의 학생 번호를 앞에서부터 i개 만큼 잘라서 새로운 sub_lst에 저장한다는 것을 의미한다.