본문 바로가기
C++ 코딩 문제 풀이/백준

[Baekjoon] 10798번: 세로읽기

by 섬댕이 2023. 5. 5.

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

 

10798번: 세로읽기

총 다섯줄의 입력이 주어진다. 각 줄에는 최소 1개, 최대 15개의 글자들이 빈칸 없이 연속으로 주어진다. 주어지는 글자는 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’

www.acmicpc.net

 

백준 사이트에서 코딩 문제를 처음 풀게 된 문제.

 

백준 사이트를 처음 이용하다보니 문제를 제출하기 위한 인터페이스가 생소해서인지

문제의 난이도에 비해 문제 해결에 상당히 오래 걸렸던 기억이 있다...

 


 

문제 해결 과정

착안

 2차원 배열의 형태로 주어지는 문자를 행 우선(row-major) 순으로 저장한 다음, 열 우선(column-major) 순으로 출력.

 

구현

문자열을 입력받기 위한 배열을 만들 때 char 형의 2차원 배열을 사용할지 STL의 string 클래스의 배열을 이용할지 조금 고민을 했는데, 문자열을 string 클래스를 사용해서 다루는 것이 익숙해서 string 클래스로 구현을 해보았다.

 

string 클래스를 이용한다면, 이 문제에서 주의해야할 점이 한 가지 있다.

각 행마다 주어진 단어의 길이가 다르기 때문에 열 우선 순서에 따라 문자를 출력하다보면, 중간에 길이를 넘는 index를 이용해 문자열에 접근하게 되면 런타임 에러가 발생한다는 것이다. 이는 간단하게 조건문을 추가하여 길이를 넘지 않는 index일 때만 접근하도록 하여 해결할 수 있다.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>
#include <string>

#define MAX_LINES 5
#define MAX_WORDS 15

using namespace std;

int main()
{
	string word[MAX_LINES];
	
    	// 행 우선 순으로 입력받아 저장
	for (int i = 0; i < MAX_LINES; i++)
		getline(cin, word[i]);

	for (int i = 0; i < MAX_WORDS; i++)
	{
		for (int j = 0; j < MAX_LINES; j++)
		{
        		// 열 우선 순으로 출력
			if ((size_t)i < word[j].length())
				cout << word[j][i];
		}
	}

	return 0;
}

 

실행 결과

* 코드를 제출한 시점과 글 작성 시점이 달라, 주석 추가 등의 이유로 실행 결과의 코드 길이는 상이할 수 있음.

'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글

[Baekjoon] 1193번: 분수찾기  (0) 2023.05.06
[Baekjoon] 2292번: 벌집  (0) 2023.05.06
[Baekjoon] 11005번: 진법 변환2  (0) 2023.05.06
[Baekjoon] 2745번: 진법 변환  (0) 2023.05.06
[Baekjoon] 2563번: 색종이  (0) 2023.05.06

댓글