코딩테스트/BOJ

[BOJ] 1235 학생번호 - JAVA

5월._. 2022. 6. 12.
728x90

1. 문제

 

1235번: 학생 번호

첫째 줄에는 학생의 수 N(2≤N≤1,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 학생의 학생 번호가 순서대로 주어진다. 모든 학생들의 학생 번호는 서로 다르지만 그 길이는 모두 같으며, 0부

www.acmicpc.net

이번에는 학생들을 더욱 효율적으로 관리하기 위해 학생마다 고유한 학생 번호를 부여하기로 하였다. 학생 번호는 0부터 9 사이의 숫자로 이루어진 문자열로, 모든 학생들의 학생 번호는 서로 다르지만 그 길이는 모두 같다.

학생들의 번호를 부여해 놓고 보니, 김진영 조교는 어쩌면 번호가 지나치게 긴 것은 아닌가 싶은 생각이 들었다. 예를 들어 아래와 같은 7자리의 학생 번호를 보자.

이름 번호
오민식 1212345
김형택 1212356
이동호 0033445


이처럼 학생 번호를 굳이 7자리로 하지 않고, 뒤에서 세 자리만을 추려서 남겨 놓아도 모든 학생들의 학생 번호를 서로 다르게 만들 수 있다.

이름 번호
오민식 345
김형택 356
이동호 445

하지만 세 자리보다 적게 남겨 놓아서는 모든 학생들의 학생 번호를 서로 다르게 만들 수 없다.
학생들의 번호가 주어 졌을 때, 뒤에서 k자리만을 추려서 남겨 놓았을 때 모든 학생들의 학생 번호를 서로 다르게 만들 수 있는 최소의 k를 구하는 프로그램을 작성하시오.


2. 풀이

1.  Set을 이용했다.

2.  맨 뒤부터 한글자씩 늘려가면서 set에 넣은 후, 최종 set의 크기가 학생 수와 같다면 k를 출력하고 종료한다.

import java.io.*;
import java.util.*;

public class BOJ_1235_학생번호 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      int N = Integer.parseInt(in.readLine());
      Set<String> set = new HashSet<>();

      String[] input = new String[N];
      for(int i=0;i<N;i++) input[i] = in.readLine();
      int len = input[0].length();

      for(int k=1;k<=len;k++){
         for(int i=0;i<N;i++){
            set.add(input[i].substring(len-k));
         }
         if(set.size()==N){
            System.out.println(k);
            return;
         }
         set.clear();
      }
   }
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1205 등수 구하기 - JAVA  (0) 2022.06.14
[BOJ] 1213 팰린드롬 만들기 - JAVA  (0) 2022.06.13
[BOJ] 1182 부분 수열의 합 - JAVA  (0) 2022.06.11
[BOJ] 1166 선물 - JAVA  (2) 2022.06.10
[BOJ] 1138 한 줄로 서기 - JAVA  (0) 2022.06.09

댓글