BOJ(백준)

[BOJ/C++] 백준 10798 세로읽기

ruming 2024. 7. 12. 21:58

아직 글을 모르는 영석이가 벽에 걸린 칠판에 자석이 붙어있는 글자들을 붙이는 장난감을 가지고 놀고 있다. 

이 장난감에 있는 글자들은 영어 대문자 ‘A’부터 ‘Z’, 영어 소문자 ‘a’부터 ‘z’, 숫자 ‘0’부터 ‘9’이다. 영석이는 칠판에 글자들을 수평으로 일렬로 붙여서 단어를 만든다. 다시 그 아래쪽에 글자들을 붙여서 또 다른 단어를 만든다. 이런 식으로 다섯 개의 단어를 만든다. 아래 그림 1은 영석이가 칠판에 붙여 만든 단어들의 예이다. 

A A B C D D
a f z z 
0 9 1 2 1
a 8 E W g 6
P 5 h 3 k x

 

 

한 줄의 단어는 글자들을 빈칸 없이 연속으로 나열해서 최대 15개의 글자들로 이루어진다. 또한 만들어진 다섯 개의 단어들의 글자 개수는 서로 다를 수 있다. 

심심해진 영석이는 칠판에 만들어진 다섯 개의 단어를 세로로 읽으려 한다. 세로로 읽을 때, 각 단어의 첫 번째 글자들을 위에서 아래로 세로로 읽는다. 다음에 두 번째 글자들을 세로로 읽는다. 이런 식으로 왼쪽에서 오른쪽으로 한 자리씩 이동 하면서 동일한 자리의 글자들을 세로로 읽어 나간다. 위의 그림 1의 다섯 번째 자리를 보면 두 번째 줄의 다섯 번째 자리의 글자는 없다. 이런 경우처럼 세로로 읽을 때 해당 자리의 글자가 없으면, 읽지 않고 그 다음 글자를 계속 읽는다. 그림 1의 다섯 번째 자리를 세로로 읽으면 D1gk로 읽는다. 

그림 1에서 영석이가 세로로 읽은 순서대로 글자들을 공백 없이 출력하면 다음과 같다:

Aa0aPAf985Bz1EhCz2W3D1gkD6x

칠판에 붙여진 단어들이 주어질 때, 영석이가 세로로 읽은 순서대로 글자들을 출력하는 프로그램을 작성하시오.

입력

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

출력

영석이가 세로로 읽은 순서대로 글자들을 출력한다. 이때, 글자들을 공백 없이 연속해서 출력한다. 

 


 

5*15 2차원 배열을 세로로 출력하는 문제다.

배열 입력하는 데서 삽질하느라 오래걸렸다. 중첩for문으로 입력받으면 5*15개의 문자를 전부 입력받을 때까지 끝나지 않기 때문에 개행문자를 입력했을 때 다음 줄로 넘어가는걸 계속 고민하다가 getline함수를 사용했다. 2번째 코드를 보면 알겠지만 더 간단하게 풀 수 있다. c++을 너무 오랜만에 만져서 까먹었다;;

 

[1번째 코드]

#include <iostream>
using namespace std;
int main()
{
    char a[5][15] = {0};
    for(int i=0; i<5; i++){
        cin.getline(a[i],5*15);
    }
    for(int i=0; i<15; i++){
        for(int j=0; j<5; j++){
            if(a[j][i]) cout << a[j][i];
        }
    }
    return 0;
}

getline함수를 사용하면 구분할 문자를 통해 문자열을 입력받을 수 있다. 디폴트 값이 \n이므로 개행문자가 들어오기 전까지 a[i]에 한줄씩 저장할 수 있다. 세로로 출력하기 때문에 a[j][i]로 출력한다. 행을 15번 반복하는 동안 하나의 열을 순서대로 출력하는 것이다. NULL문자가 출력되지 않게 조심하자. NULL문자 처리를 안하면 틀린다.

 

cin.getline(char buf[], int size, char delimitChar)
buf : 문자열을 저장할 배열
size : 배열의 크기
delimitChar : 입력 끝을 구분할 문자

 

[2번째 코드]

#include <iostream>
using namespace std;
int main()
{
    char a[5][15] = {0};
    for(int i=0; i<5; i++){	// 한줄씩 입력
        cin >> a[i];
    }
    for(int i=0; i<15; i++){
        for(int j=0; j<5; j++){
            if(a[j][i]) cout << a[j][i];
        }
    }
    return 0;
}

단순히 열만 돌려도 한줄씩 입력받을 수 있다.

 

 

'BOJ(백준)' 카테고리의 다른 글

[BOJ/C++] 백준 1009 분산처리  (0) 2024.07.13
[BOJ/C++] 백준 1032 명령 프롬프트  (0) 2024.07.13
[BOJ/C++] 백준 1912 연속합  (2) 2022.11.20
[BOJ/C++] 백준 7576, 7569 토마토  (0) 2022.10.09
[BOJ/C++] 백준 2178 미로탐색  (0) 2022.10.09