[백준] 10798, 세로 읽기

YUN·2026년 2월 22일

C++

목록 보기
45/81



이 문제는 어찌저찌 맞긴했지만, 내 풀이가 매우 매우 매우 매우 매우 매우 매우 매우 매우 비효율적이었을 뿐더러 배운 것도 매우 많은 문제였기에 가져와봤다.

이 문제의 핵심은

어떻게 공백(사실은 공백이 아니지만) 을 처리할 것 이냐?

이다.

1. 나의 풀이

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    char arr[5][15];
    for (int i=0;i<5;i++) fill(arr[i]+0, arr[i]+15, '+');   
    string s;
    for (int i=0;i<5;i++) {
        getline(cin,s);
        for(int j=0;j<s.size();j++) {
            arr[i][j]=s[j];
        }
    }
    for (int i=0;i<15; i++) {
        for (int j=0;j<5;j++) {
            if(arr[j][i] != '+') cout << arr[j][i];
        }
    }
    
    return 0;
}

실행하면 정답 처리가 되긴하나 문제가 매우 많다.

문제를 하나 하나 따지기엔 너무 문제점이 많아서...그냥 훨씬 더 효율적인 코드를 보면서 설명하는 것이 나을 것 같다.

2. 다른 풀이

#include <iostream>

using namespace std;

int main() {
    char arr[5][15] = {};
    for(int i=0;i<5;i++) cin >> arr[i];
    for (int i=0;i<15;i++) {
        for(int j=0;j<5;j++) {
            if(arr[j][i] != '\0') cout << arr[j][i];
        }
    }
    return 0;
}

일단 길이 부터 매우 짧고, 한 눈에 봐도 아주 코드가 간결하다.

(1) char 자료형의 두 가지 모습

char 자료형은 참 신기하게도, 2가지 모습을 가진다.

'a'char 97 도 둘다 char 자료형 이다.

또한 둘은 정확히 동일하다.

'a' 는 표면적인 형태이고, char 97 은 내부적인 형태로 생각하면 된다.

코드에 'a'라고 되있더라도 이는 내부적으로 char 97 인 것이다.

(2) char 배열의 초기화

char arr[5][15] = {};

이렇게 하면 char 배열이 어떤 값으로 초기화될까?

다들 알다시피 char 0 으로 초기화된다.

그렇다면 char 0은 무엇일까? '\0' 이다. (\0의 ASCII 코드는 0 이다)

따라서 위의 방식으로 초기화하면 char 배열이 전부 '\0' 으로 초기화된다.

이를 이용해 해당 칸의 데이터가 '\0' 인지 확인함으로써 배열의 해당 인덱스가 빈 칸 인지 아닌지 확인이 가능하다.

(3) 2차원 배열은 1차원 배열로 이루어진다.

arr (2차원 배열)
│
├── arr[0] (1차원 배열: int[4])
│   ┌─────────┬─────────┬─────────┬─────────┐
│   │ arr[0][0]│ arr[0][1]│ arr[0][2]│ arr[0][3]│
│   │   10    │   20    │   30    │   40    │
│   └─────────┴─────────┴─────────┴─────────┘
│
├── arr[1] (1차원 배열: int[4])
│   ┌─────────┬─────────┬─────────┬─────────┐
│   │ arr[1][0]│ arr[1][1]│ arr[1][2]│ arr[1][3]│
│   │   50    │   60    │   70    │   80    │
│   └─────────┴─────────┴─────────┴─────────┘
│
└── arr[2] (1차원 배열: int[4])
    ┌─────────┬─────────┬─────────┬─────────┐
    │ arr[2][0]│ arr[2][1]│ arr[2][2]│ arr[2][3]│
    │   90    │  100    │  110    │  120    │
    └─────────┴─────────┴─────────┴─────────┘

이렇듯, 위의 경우 arr[1]은 1행의 배열을 나타낸다.

(4) char arr[5][15] = {}; cin >> arr[i];

arr[i]는 2차원 배열을 이루는 char 배열중 하나이다. 따라서 위의 코드를 실행하면, 입력이 char 배열 타입으로 arr[i]에 들어간다.

예를들어보자,

C++ Stream Buffer에 afzz가 있다면 -> 이는 ['a','f','z','z','\0'] 의 형태로 arr[i]에 들어가게된다.

3. 느낀 점

유튜브에 찾아보니,,, 효율적인 코딩 테스트 준비를 위해서는

풀이 제출 전

  • 테스트 케이스 만들어서 시뮬레이션 돌려보기
  • 풀이의 시간, 공간 복잡도 분석하기

풀이 제출 후

  • 다른 사람들의 코드를 보며 다양한 풀이 방식 흡수
  • 한달 내로 다시 와서 풀기 (15분 내로 풀 수 있을 때까지 반복)

이렇게 해야한다고한다.

한달 내로 다시 풀수 있을진 모르겠지만 앞으로도 계속해서 다른 사람의 코드를 보며 다양한 풀이 방식을 흡수해야겠다. 다른 사람들의 코드를 보는것이 나에게 정말 많은 도움이 되는것이 느껴진다.

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글