[백준 10798] '세로 읽기'
백준이다
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;
}
야미~~