백준 1235번 - 학생 번호

학생 번호 문제 바로 가기

풀이 날짜: 2026-02-13

baekjoon 알고리즘 문제 풀이

풀이 코드


n = int(input())

answer = []
for _ in range(n):
    answer.append(input().strip())

for i in range(1,len(answer[0])+1):
    data = set()

    for num in answer:
        data.add(num[-i:])

    if len(data) == n:
        print(i)
        break
  

문제 접근

백준 1235번은 학생 번호 여러 개가 주어졌을 때, 뒤에서 몇 자리까지 보면 모든 학생을 서로 구분할 수 있는지를 구하는 문제였다. 처음에는 문자열을 한 글자씩 비교해야 하나 고민했지만, 문제의 핵심은 “부분 문자열 비교”였다. 즉, 글자 단위가 아니라 뒤에서 k자리씩 잘라 비교하는 방식으로 접근해야 했다.

나는 먼저 학생 번호를 리스트에 저장한 뒤, 뒤에서 1자리부터 시작해 점점 늘려가며 비교하는 방식으로 해결했다. 매 단계마다 각 학생 번호의 뒤에서 k자리를 잘라 set에 넣고, set의 길이가 학생 수와 같아지는 순간을 찾는 방식이었다.


핵심 아이디어

  1. num[-i:]
    문자열의 뒤에서 i자리를 잘라내는 슬라이싱
  2. set()
    중복을 자동으로 제거.

뒤에서 i자리를 잘라 set에 넣었을 때 길이가 n과 같다면, 모든 학생이 서로 다른 값을 가지므로 구분이 가능하다는 것이다.


내가 헷갈렸던 부분

  1. len(answer) vs len(answer[0])

    처음에는 반복 범위를 range(1,len(answer)+1)로 설정했는데, len(answer)는 학생수(n)이었다. 증가시켜야 하는 것은 학생 수가 아니라 학생 번호의 길이이기 때문에, len(answer[0])을 사용해야 했다.

  2. num[:-i]와 num[-i:]의 차이
    • num[:-i] → 앞부분을 남기고 뒤를 자르는 것
    • num[-i:] → 뒤에서 i자리만 가져오는 것 문제는 “뒤에서 몇 자리”를 비교하는 것이므로 반드시 num[-i:]를 사용해야 했다.
  3. break의 위치 설정 처음에는 break를 if문 밖에 둬서 반복이 한 번만 실행되는 실수를 했다. 정답을 찾았을 때만 반복을 종료해야 하므로 break는 반드시 조건문 안에 있어야 한다.

이 문제에서 기억해야 할 것

  • 문자열 비교 문제라고 해서 항상 한 글자씩 비교하는 것은 아니다.
  • 슬라이싱 [-k:]는 “뒤에서 k자리”라는 의미다.
  • set은 중복 검사에 매우 강력하다.
  • 반복 범위 설정 시, “무엇의 길이를 기준으로 하는지” 정확히 생각해야 한다.