SWEA/[D2]

[C언어] SWEA 1946 간단한 압축 풀기

ruming 2022. 2. 26. 04:45

알파벳을 주어진 만큼 출력하되 한 줄에 10개씩 출력한다.

 

구현

문자열에 알파벳을 저장하고 10개씩 출력할 것이다.

 

#include <stdio.h>
int main(void) {
    int test_case, T;
    scanf("%d", &T);
    for (test_case = 1; test_case <= T; ++test_case)
    {
        int N, index = 0, n[10] = { 0 };
        char answer[201] = { 0 }, al[11] = { 0 };
        scanf("%d", &N);

        for (int i = 0; i < N; i++) {
            scanf("%s %d", &al[i], &n[i]);
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < n[i]; j++) {
                answer[index++] = al[i];
            }
        }
        int sum = 0;
        for (int i = 0; i < N; i++)  sum += n[i];
        printf("#%d\n", test_case);
        for (int i = 0; i<sum; i++) {
            printf("%c", answer[i]);
            if ((i + 1) % 10 == 0) {
                printf("\n");
            }
        }
    }
    return 0;
}

answer라는 문자열을 생성해 알파벳을 반복한 횟수만큼 저장하고, 10의 배수마다 개행문자를 출력해 개행한다.

N과 Ki의 범위가 크지 않아서 가능한 방법이었다. 

 

근데 생각해보니까 문자를 출력할 때마다 개수를 세면 굳이 문자열을 다 저장할 필요가 없다는 것을 깨달았다. 

#include <stdio.h>
int main(void) {
    int test_case, T;
    scanf("%d", &T);
    for (test_case = 1; test_case <= T; ++test_case)
    {
        int N, ck = 0, n[10] = { 0 };
        char al[11] = { 0 };
        scanf("%d", &N);
        for (int i = 0; i < N; i++) {
            scanf("%s %d", &al[i], &n[i]);
        }
        printf("#%d\n", test_case);
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < n[i]; j++) {
                printf("%c", al[i]);
                ck++;
                if (ck % 10 == 0)	printf("\n");
            }
        }
        printf("\n");
    }
    return 0;
}

이렇게 간단하게 풀 수가 있었네

 

 

더보기
#include <stdio.h>
#include <stdlib.h>
int main(void) {
	int testcase, n, i, j, c = 0, k;
	int* num;
	char* word;
	scanf("%d", &testcase);
	for (i = 0; i < testcase; i++) {
		scanf("%d", &n);
		num = (int*)malloc(sizeof(int) * n);
		word = (char*)malloc(n + 1);
		for (j = 0; j < n; j++)	scanf("%s %d", &word[j], &num[j]);
		printf("#%d\n", i + 1);
		c = 0;
		for (j = 0; j < n; j++) {
			for (k = 0; k < num[j]; k++) {
				printf("%c", word[j]);
				c++;
				if (c % 10 == 0)	printf("\n");
			}
		}
		printf("\n");
	}
	return 0;
}

 

 테스트 케이스 한번에 출력하려고 했던 시절

#include <stdio.h>
#include <stdlib.h>
int main(void){
	int *num, n;
	int testcase, i, j, k, c;
	int sum = 0;
	char *word;
	
	scanf("%d", &testcase);
//	n = (int*)malloc(sizeof(int)*testcase);
	for(i=0; i<testcase; i++)	scanf("%d", &n);

	
	num = (int*)malloc(sizeof(int)*n*testcase);
	word = (char*)malloc(n*testcase+1);
	for(i=0; i<testcase; i++){
		for(j=0; j<n; j++)	scanf("%s %d", &word, &num);
	}
	printf("%s %d", word[0], num[0]);
/*	char *print;
	for(i=0; i<n*testcase; i++)	sum += num[i];
	print = (char*)malloc(sum+1);
	for(i=0; i<testcase; i++){
		for(j=0, c=0; j<n; j++){
			for(k=0; k<num[j]; k++)	print[c] = word[j];
			c=num[j];
		}
	}
	for(i=0; i<sum; i++){
		printf("%s", print[i]);
		if(i%10==0)	printf("\n");
	}*/
	return 0;
}