백준/C++

[백준] 10798번: 세로 읽기 | C++ 풀이

성실한 당근농부 2023. 5. 27. 19:35

# 문제

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

 

 


 

# 풀이

풀이 단계에 명시된 대로 2차원 배열을 사용해 풀면 어렵지 않은 문제다.

해당 글에서는 2차원 배열을 사용한 풀이와 1차원 배열을 사용한 풀이 두 가지를 적어두었다.

문제에서 제시한 대로도 풀어보고 생각나는 대로도 풀어보며 다양한 풀이를 익혀보자.

 

 

🖱️ 풀이1 | 2차원 배열 사용

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제

    string matrix[5][15];
    for(int i=0; i<5; i++){
        string s;
        cin >> s;
        for(int j=0; j<15; j++){
            if(j < s.length()) matrix[i][j] = s[j];
            else matrix[i][j] = " ";
        }
    }

    for(int i=0; i<15; i++){
        for(int j=0; j<5; j++){
            if(matrix[j][i] != " ") cout << matrix[j][i];
        }
    }
    return 0;
}

 

2차원 배열 풀이는 입력을 배열에 넣어주고 문제에서 원하는대로 출력하는 두 단계로 구성했다.

 

 

 

string matrix[5][15];
for(int i=0; i<5; i++){
    string s;
    cin >> s;
    for(int j=0; j<15; j++){
        if(j < s.length()) matrix[i][j] = s[j];
        else matrix[i][j] = " ";
    }
}

총 다섯줄의 입력이 주어지고, 각 줄에는 최대 15개의 글자들이 주어지므로 배열의 크기를 5, 15로 설정해주었다.

그 후 입력을 가져와 한 글자씩 배열에 채워주고, 남은 공간은 공백을 넣어주면 출력 준비는 끝이다.

 

 

for(int i=0; i<15; i++){
    for(int j=0; j<5; j++){
        if(matrix[j][i] != " ") cout << matrix[j][i];
    }
}

출력 시에는 이중 for문 인덱스의 범위를 아까와 반대로 해주면 문제에서 원하는대로 답을 얻을 수 있다.

공백이 아닌 경우에만 해당 순서로 출력하면 되므로 if문으로 검사해준 후 출력하면 끝!

 

 


 

🖱️ 풀이2 | 1차원 배열 사용

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제

    string matrix[5];
    for(int i=0; i<5; i++){
        cin >> matrix[i];
    }

    for(int i=0; i<15; i++){
        for(int j=0; j<5; j++){
            if(i < matrix[j].size()) cout << matrix[j][i];
        }
    }
    return 0;
}

이번엔 굳이 2차원 배열을 사용할 필요가 있나...? 싶은 생각이 들어서 해본 1차원 배열을 사용한 풀이다.

 

 

 

string matrix[5];
for(int i=0; i<5; i++){
    cin >> matrix[i];
}

 

우선 크기 5의 1차원 배열을 선언해주고 입력을 한 줄씩 받아왔다.

 

 

for(int i=0; i<15; i++){
    for(int j=0; j<5; j++){
        if(i < matrix[j].size()) cout << matrix[j][i];
    }
}

출력 시에는 아까와 동일한 범위로 for문을 실행하면 되는데, 풀이 1에서 했던 공백 검사 대신 i의 인덱스를 입력의 사이즈까지만 주면 된다.

 

예를 들어,

첫 줄의 입력이 AABCDD라면 matrix[0][0]~matrix[0][5]

두번째 줄의 입력이 afzz라면 matrix[1][0]~matrix[1][3] 

이런 식으로 출력하겠다는 소리다.

 

if문으로 i가 해당 범위까지만 출력될 수 있도록 하면 끝!

 

 

 

▶ 풀이 1 | 2차원 배열 사용

▶ 풀이 2 | 1차원 배열 사용

 

 


 

 

 

10798번: 세로읽기

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

www.acmicpc.net

 

728x90