본문 바로가기

Algorithm/Brute Force

(C++) - 백준(BOJ) 1235 : 학생 번호

반응형

https://www.acmicpc.net/problem/1235

 

1235번: 학생 번호

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

www.acmicpc.net

모든 경우의 수를 탐색하는 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

n, 학생번호 길이 length, ans, 학생 번호를 저장할 vector변수 students, map변수 m을 선언합니다.

📔 풀이과정

0 ~ length - 1까지 loop를 수행합니다.1. 그 안에서 n개의 학생 list를 확인하면서 뒤에 k만큼만 남긴뒤 map에 추린 학생번호를 key, key의 빈도 수를 value로 두어서 저장해줍니다.2. 저장완료 후 map의 원소를 확인하면서 빈도수가 1초과인지 확인하는 함수 isDuplicated를 수행해서 중복여부를 검사합니다.3. 중복이 없다면 그 길이의 최솟값을 ans에 저장합니다.

📔 정답출력

ans를 출력해줍니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;

int n, length, ans;
vector <string> students;
map <string, int> m;

bool isDuplicated(){
  for(auto el : m)
    if(el.second > 1) 
      return true;
  return false;
}

int main(){
  cin >> n;
  students.resize(n);
  for(int i = 0; i < n; i++) cin >> students[i];
  length = students[0].size();
  ans = length;
  for(int k = 0; k < length; k++){
    m.clear();
    for(int i = 0; i < n; i++) m[students[i].substr(k)]++;
    if(!isDuplicated()) ans = min(ans, length - k);
  }
  cout << ans;
}