본문 바로가기
문제 풀이/[BaekJoon]

[BaekJoon] 3711번 학번 (Silver 5) - Python

by 조랩 2022. 12. 19.

문제

Z 대학교 학생은 입학할 때 학번을 받게 된다. 학번은 0보다 크거나 같고, 10^6 - 1 보다 작거나 같은 정수이다. Z 대학의 김상근 교수는 학번으로 학생들을 구분한다. 상근이는 학생들을 조금 더 쉽게 기억하기 위해서 자신이 가르치는 학생들의 학번을 m으로 나누었을 때, 나머지가 모두 다른 가장 작은 양의 정수를 찾으려고 한다.


입출력 예시

 

입력: 첫째 줄에 테스트 케이스의 개수 N이 주어진다. 각 테스트 케이스의 첫째 줄에는 상근이가 가르치는 학생의 수 G가(1 ≤ G ≤ 300) 주어진다. 다음 G개 줄에는 학생의 학번이 한 줄에 하나씩 주어진다. 학번이 같은 경우는 없다.

출력: 각 테스트 케이스마다, 학번을 m으로 나눈 나머지가 모두 다른 가장 작은 정수 m을 출력한다.

 

예제입력1)

2
1
124866
3
124866
111111
987651

예제출력1)

1
8

코드

 

a = int(input()) # 테스트 케이스 수 입력

for _ in range(a): # 테스트 케이스 수 만큼 반복
    nums = list() # 학번을 저장할 리스트 생성
    stu_num = int(input()) # 학생의 수 입력

    for _ in range(stu_num): # 학생 수 만큼 반복
        nums.append(int(input())) # 학번 입력 후 리스트에 저장

    k = 1 # 나누는수 1부터 시작
    while True: # 조건 충족시까지 무한반복
        result = set() # 학번을 k로 나눈 나머지가 서로 다 달라야 하기 때문에 set자료형을 이용.
                       # set자료형은 중복값이 존재하지 않는다는 특징이 있어 중복 여부 확인에 용이함.
        for n in nums: # 학번을 하나씩 가져와서
            result.add(n % k) # k로 나눈 나머지를 result에 추가
        if len(result) == stu_num: break # 만약 result의 원소 개수가 stu_num과 같다면 반복 종료
        else: k += 1 # 그게 아니라면 k를 1 증가시키고 반복

    print(k) # k값 출력

실행 화면


채점 결과

728x90