백준

[백준 10798] '세로 읽기'

vcs 2024. 3. 29. 10:35

백준이다

 

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

 

 

그렇다고 한다

 

문제의 구조를 본다면

대충 최대길이 15짜리 문자열을 5개 입력받고

 

그걸 첫 번째부터 세로로 읽는다는 것

이렇게


그렇다면 어떻게 풀 수 있을까

 

크게 코드를 세 부분으로 나눌 수 있다 

 

1. 문자열 입력받기 

2. 문자열중에서 길이가 가장 긴 문자열의 길이 구하기

3. 문자열의 열을 고정하고 행을 각각 출력하기

 

사실 2번을 하지 않고 그냥 열 반복을 문자 최대길이인 15로 돌려도 된다

하지만 열의 길이가 길지 않은 경우 작업효율이 별로 좋지 못하다

 

C++로 코드를 적어보자

 

string input[5];

for (int i = 0; i < 5; i++)
{
	getline(cin, input[i]);
}

문자열 총 5개를 위 코드를 통해 입력받고

 

int maxLen = input[0].length();
for (int i = 0; i < 5; i++)
{
	if (input[i].length() > maxLen) {
		maxLen = input[i].length();
	}
}

문자열 5개를 검사하여 길이 최댓값을 구한다

 

그리고 이들을 이용하여 조건에 맞게 출력해주어야 하는데

이 문제의 관건은 이것이다.

어떻게 출력해야 하는가?

 

문자도 배의 일종이라 인덱스로 가져와 출력하면 될 것이라 생각이 바로 들었다면

반은 성공한 것이다 

for (int i = 0; i < maxLen; i++)
{
	for (int j = 0; j < 5; j++)
	{
        ???
	}
}

대충 이렇게 하지 않을까

 

이제 이 안에 출력할 내용을 적어주자

for (int i = 0; i < maxLen; i++)
{
	for (int j = 0; j < 5; j++)
	{
		cout << input[j][i];
	}
}

이렇게 적고 동작해 보자

오 잘된다

 

 

하지만 이게 끝이 아니다

테스트 케이스 2를 넣어보면 

그렇다 망한 것이다

 

원인이 뭘까?

출력된 부분을 다시 보면 

'D1gkD'  빨간색 X인 부분에서 끊겼다

 

 

D와 1gk사이에도 공백이 있는데 왜 저기서 끊기지 않았는가

 

문자열의 끝에는 Null문자( \0 )가 있어서 그걸 출력을 한 것이다

하지만 그다음은 할당된 값이 없는데 그걸 출력하려 해서

문제가 생긴 것이다 

 

 

출력할 부분의 문자열이 비어있으면 오류가 발생하는 것으로 추정되므로 

출력할 부분이 NULL이면 continue로 다음 반복으로 넘어가 보자

for (int i = 0; i < maxLen; i++)
	{
	for (int j = 0; j < 5; j++)
	{
		if (input[j][i] == NULL)
			continue;
		cout << input[j][i];
	}
}

 

 

하지만 아직 문제가 존재한다

 

이유는 문자열 메모리상에 아예 존재하지 않는 값은 Null이 아니라 그냥 없는 거다

공간에 값이 없는 게 아니라 공간 자체가 없는 것.

결과적으로 아예 없는 공간을 Null인지 체크하려 했기 때문이다

 

for (int i = 0; i < maxLen; i++)
{
	for (int j = 0; j < 5; j++)
	{
		if (input[j].length() < i+1)
			continue;
		cout << input[j][i];
	}
}

 

따라서 이렇게 해결가능하다

아예 길이를 체크해서 예상보다 짧으면 그냥 continue 해버린다

 

 

전체 코드는 이러하다

#include <iostream>
#include <string>
using namespace std;

int main() {
	string input[5];

	for (int i = 0; i < 5; i++)
	{
		getline(cin, input[i]);
	}
	int maxLen = input[0].length();
	for (int i = 0; i < 5; i++)
	{
		if (input[i].length() > maxLen) {
			maxLen = input[i].length();
		}
	}
	for (int i = 0; i < maxLen; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			if (input[j].length() < i+1)
				continue;
			cout << input[j][i];
		}
	}

	return 0;
}

 

 

야미~~