BaekJoon 1235번: 학생 번호 (Python)

SSW·2022년 8월 9일
0

BOJ

목록 보기
12/12

1. Problem


2. Solution

  • solution 1
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)
  • solution 2
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문 종료

3. Detail

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에 저장한다는 것을 의미한다.


profile
ssw

0개의 댓글