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 |
댓글