프로그래밍 언어/C

C언어 백준 2675번 문자열 반복 해설 (scanf 오류 해결)

happy_life 2021. 9. 8. 10:12

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

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

 

문제

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

 

 

풀이과정

 

 

1) scanf 이 왜 한번만 될까?

#include <stdio.h>
#include <string.h> //strtok 함수를 위한 것 

int main() {
	int T; //TEST CASE 개수 
	char input[22]; //R+space+chleo 20글자 <=22 이므로 길이 22인 char 형 배열 선언 

	scanf("%d", &T);
	

	for (int i = 0; i < T; i++) {

		scanf("%s", input);
		printf("%s", input);
		fflush(stdin); //버퍼비우기  남아있던 \n 사라지고 scanf 할 수있음 
		 
	}

	return 0;

}

fflush로 버퍼까지 비워 scanf 가 올바르게 작동할 줄 알았으나, 한번만 하고 종료된다 .fflush 는 논외로 하고

 

문자열 입력에 숫자가 들어가서 그런가 추측 해본다..혹은 space바를 구분해주지 않아서...그런 것 같다.

scanf 는 " ' '(스페이스바), \t,\n'" 앞에서 끊긴다고 한다 .

 

 

 

▼질문 올림..

질문
답변

scanf 자체는 줄이 아니라 words 를 읽는다.

prinf로 scanf 뭐 되었는지 항상 체크해라.

 

 

scanf 한번 하는 이유

 

내가 '3 ABC'를 입력한 것을 scanf 는 두 개로 나눠서 인식하는 것임.

중간에 있는 spacebar 를 기준으로 

첫번째 3

두번째 ABC

따라서 나는 한 번 입력했다고 생각한 것이 

scanf 입장에서는 두 번 입력된 것이다.

 

 

1)숫자 + 문자열 한번에 입력하는 idea

 

 

for (int i = 0; i < T; i++) {

		scanf("%d %s", &M,input);
		printf("%d\n", M);
		printf("%s\n",input);

	}

 

 

결과값

 

2)for 문을 활용해 숫자 x 문자열 인수 출력하는 idea

 

for (int i = 0; i < strlen(input); i++) {
		
		cnt = 0;
		while ( cnt < M)
		{
			printf("%c", input[i]);
			cnt++;
		}
		
	}

for 문자열 기준으로 

출력하는 코드인데, 한 번밖에 출력되지 않았다.

AAABBBCCC는 어디간 거지?

처음 3 ABC는 scanf 가 한번 더 돌아가면서 5 /HTP 로 덮이는데

이걸 기준으로 밑에서 for 문을 돌리니까 3 ABC가 안나오는 것이다.

따라서 scanf로 넣은 값이 덮어쓰기 되기 전에 값을 출력해야한다.

따라서 이런식으로 scanf("%d %s", &M,input) 뒤에

코드를 바로 넣어주었다.

for (int i = 0; i < T; i++) {

		scanf("%d %s", &M,input);

		for (int i = 0; i < strlen(input); i++) {

			cnt = 0;
			while (cnt < M)
			{
				printf("%c", input[i]);
				cnt++;
			}

		}

출력값

 

정답코드

#include <stdio.h>
#include <string.h> //strtok 함수를 위한 것 

int main() {
	int T=0; //TEST CASE 개수 
	char input[22]; //R+space+chleo 20글자 <=22 이므로 길이 22인 char 형 배열 선언 
	int M = 0;; // 좌측의 수 
	int cnt = 0; 
	scanf("%d", &T);
	

	for (int i = 0; i < T; i++) {

		scanf("%d %s", &M,input);

		for (int i = 0; i < strlen(input); i++) {

			cnt = 0;
			while (cnt < M)
			{
				printf("%c", input[i]);
				cnt++;
			}

		}
		printf("\n");
	}

	

	return 0;

}