반응형

코드포스 4C Registration system 풀이 코드 | Java (자바)


문제 해설

문자열들을 순서대로 기록하며 새로운 문자열일 땐 'OK'를, 중복된 문자열일 땐 문자열 끝에 오름차순으로 숫자를 붙여 출력하는 문제입니다.

풀이

한 번 등장한 문자열을 HashSet에, 해당 문자열과 중복 횟수를 HashMap에 저장하면서 새로 들어오는 문자열이 중복인지 아닌지 판단합니다. 최대 100,000개 문자열이 들어오기 때문에 List 같은 구조를 사용할 경우 문자열 중복을 판단할 때 시간제한에 걸리기 쉽습니다. 그래서 탐색이 빠른 HashSet.contains()를 사용합니다. 또, 혹시 모를 입출력 지연도 막기 위해 Scanner 대신 BufferedReader를 사용했습니다. 문자열이 중복되지 않는다면 각 HashMap과 HashSet에 새로운 문자열을 기록하고 'OK'를 출력, 중복이라면 해당 문자열의 중복 횟수를 1회 늘린 후 중복 횟수와 함께 출력합니다.

코드

import java.util.HashMap;
import java.util.HashSet;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> numbers = new HashMap<>();
        HashSet<String> names = new HashSet<>();
        String buffer;
 
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            int n = Integer.parseInt(br.readLine());
 
            for(int i = 0; i < n; i++){
                buffer = br.readLine();
                if(!names.contains(buffer)){
                    numbers.put(buffer, 1);
                    names.add(buffer);
                    bw.write("OK\n");
                }
                else{
                    bw.write(buffer+ numbers.get(buffer) +"\n");
                    numbers.put(buffer, numbers.get(buffer) + 1);
                }
            }
        
        	bw.flush();
        	bw.close();
        }
        catch (Exception e) {
        }
    }
}

문제 출처

https://codeforces.com/contest/4/problem/C

반응형

+ Recent posts