상세 컨텐츠

본문 제목

백준 class1 11721번 열 개씩 끊어 출력하기

백준 연습

by 빙하둘리 2022. 8. 17. 00:35

본문

728x90

백준 class1 11721번 열 개씩 끊어 출력하기

널 문자가 절대 출력되면 안된다는 조건이 있다.

참고) https://www.acmicpc.net/board/view/25166

 

글 읽기 - ★☆★☆★ [필독] 열 개씩 끊어 출력하기 FAQ ★☆★☆★

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

  1. ★☆★☆★☆★☆ 널 문자는 단 한 개도 출력해서는 안 됩니다!!! ☆★☆★☆★☆★ 비록 일부 환경 (Visual Studio 등)에서는 널 문자를 출력해도 공백처럼 나타나 눈치채지 못하는 경우가 많지만 실제로는 공백과는 전혀 다른 하나의 문자가 출력되는 것입니다. 어떠한 경우에도 널 문자를 단 한 개라도 출력한다면 오답이 됩니다. 절대로, 절대로, 무슨 일이 있어도 세상이 무너져도 널 문자가 출력되지 않게 조심하세요. 문자열의 마지막 문자를 넘어섰는데 출력을 더 하지 말라는 뜻입니다. 널 문자를 이미 출력한 뒤에 곧바로 종료해도 늦습니다.
  2. 10의 배수 개만큼 출력하고 종료해야 하는 경우를 조심하세요. 이러한 경우를 제대로 처리하지 않아서 틀리는 경우가 매우 많습니다.
  3. 최대 100개의 문자가 입력된다면, 그를 위해 필요한 공간은 최소 101칸입니다. 왜냐하면, 모든 문자열은 끝에 널 문자 하나를 반드시 필요로 하기 때문이고, 문자열 입력 함수들도 널 문자를 끝에 의무적으로 삽입해주기 때문입니다. 또한, fgets 등 개행 문자까지 저장하는 함수로 입력을 받았다면 개행 문자까지 포함해서 102칸이 필요하지만, 개행 문자는 무시해도 정답을 받을 수는 있습니다.
  4. 첫 줄의 시작에 개행 문자를 출력해서는 안 됩니다. 이럴 경우 "출력 형식이 잘못되었습니다"를 받게 됩니다.

눈에 안 보였지만 널 문자를 출력해줘서 문제였던 것이다.

 

널 문자 관련 테스트

#include <iostream>
#include <cstring> //헤더 문제
using namespace std;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);

	char str[102];
	fgets(str, 102, stdin);
	int len = strlen(str);
	str[len - 1] = '\0'; // 개행문자 있는 부분을 널 문자로 대체
	//그러고 문자열의 길이를 다시 잰다.

	int length = strlen(str);
	cout << "문자열의 길이는" << length<<'\n';

	int i;
	for (i = 0; i < length; i++)
	{
		if (str[i] = '\0')
			break; // 널 문자는 표시 안 하게끔
	}
	cout << "널 문자 만나기 직전 인덱스는" << i-1<<'\n';

	int j;
	for (j = 0; j < length; j++)
	{
		cout << str[i];
	}
	cout << "널 처리 안 하고 하면" << j;


	return 0;
}

문자열 길이는 39

i-1=38

j=39

이렇게 나오는데?? ?? 그래도 널은 걸러줘야 한다. 아무래도 테스트 케이스가 따로 있을 테니까.

from 공지사항 : 널은 출력이 안 되게끔 해야한다!

 

내가 맞은 정답 코드

#include <iostream>
#include <cstring> //헤더 문제
using namespace std;

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	char str[102]; 
	fgets(str, 102, stdin);
	int len = strlen(str);
	str[len - 1] = '\0'; // 개행문자 있는 부분을 널 문자로 대체
	//그러고 문자열의 길이를 다시 잰다.

	int length = strlen(str);

	
	for (int i = 0; i < length; i++)
	{
		if (str[i] != '\0') {
			cout<<str[i];

			//문장 마지막은 일의 자리가 9인 경우
			//인덱스 0부터 9까지 10 글자가 채워져서 그렇다.
			//문장 하나 자르고 엔터키 넣어준다.

			if (((i + 1) % 10 == 0) && (i != length - 1))
				cout << '\n';
			//길이가 10의 배수일 때, 마지막은 나오지 않게 하기.
		}
	}

	return 0;
}

 

정답 코드에서 i가 얼만큼 나오는지 보자

 

[추가 주의 사항]

파일의 끝을 의미하는 EOF를 만나면, scanf는 -1을 반환합니다.

-1은 true이기 때문에 while문을 탈출하지 못합니다.

 

EOF를 쓸 때, TRUE/FALSE로 판단하지 말자.

 

참고하면 좋은 질문글 https://www.acmicpc.net/board/view/16208

728x90

'백준 연습' 카테고리의 다른 글

백준 C++ 배우기 시리즈 1292번) 쉽게 푸는 문제  (0) 2022.08.20
백준 class1) 1157번 단어 공부 관련 C++ 지식  (0) 2022.08.18
중간 연습  (0) 2022.08.15
10951, 10952  (0) 2022.08.12
백준 class1) 11720번 숫자의 합  (0) 2022.08.11

관련글 더보기

댓글 영역