반응형

코드포스 4C Registration system 풀이 코드 | C (C언어)


문제 해설

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

풀이

동적할당으로 배열을 선언하고 문자열을 입력받을 때마다 기존 배열과 비교하여 새 문자열이 중복인지 아닌지 판단합니다. 각 문자열의 중복이 몇 번 있었는지 표시할 int 배열도 선언하여 비교에 사용합니다. 중복되지 않았다면 배열에 해당 문자열을 추가함과 동시에 'OK'를 출력하고, 중복이라면 문자열을 배열에 추가하지는 않고 중복 횟수는 1회 늘린 후 해당 문자열과 숫자를 출력합니다.

코드

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int printString(int l, int n, char** names, int* number, char* buffer){
    int i;
    
    if (l > 0){
        char* newstrptr = (char*)malloc(sizeof(char) * (l + 1));
        strcpy(newstrptr, buffer);
        for(i = 0; i <= n; i++){
            if(!strcmp(names[i], newstrptr)){
                number[i]++;
                printf("%s%d\n", names[i], number[i]);
                return n;
            }
        }
        strcpy(newstrptr, buffer);
        names[n] =  newstrptr;
        printf("OK\n");
        n++;
    }
    return n;
}
 
 
int main(){
    int maxLength = 10000, i, times;
    char* names[maxLength];
    
    for(i = 0; i < 10000; i++){
        names[i] = (char*)malloc(sizeof(char) * 33);
    }
    
    int number[10000] = {0, };
    char buffer[33];
    int n = 0;
    int l = 0;
    scanf("%d", &times);
    
    for(i = 0; i < times; i++){
        scanf("%s", buffer);
        l = strlen(buffer);
        n = printString(l, n, names, number, buffer);
    }
    return 0;
}

문제 출처

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

반응형

+ Recent posts