본문 바로가기
온라인저지

[icpc.me]10798번: 세로읽기 writeup

by plzfday 2017. 7. 20.

10798번: 세로읽기

링크

적용 범위 : 문자열!

이 문제는 문자열에 대한 이해도를 높이는 데 좋은 문제 중 하나라고 생각합니다.

문제는 링크를 통해 확인하시길 바랍니다!

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

대충 이런 식으로 존재한다면 Aa0apAf985··· 이렇게 출력을 해주면 되는 굉장히~ 간단하면서도 괜찮은 문제인 것 같습니다!

물론 저는 어려웠습니다...

처음에 힌트를 뭘로 드렸죠??
맞습니다. 바로 문자열입니다.

저는 배열을 선언할 때 [5][15]의 크기를 갖고 있는 char형 배열을 선언 했습니다. 이렇게 하면 조금 문제 풀기가 쉬워지는 이유가 [5][15]에서 사실 입력되는 값은 15보다 작은 수 있는데 그것은 예외처리를 해주면 그만이기 때문입니다.

loop 범위

이중 loop를 돌면서 출력을 해주면 되는데요. 이때 주의하셔야할 점이 있다면, 저희가 출력해야하는 들의 인덱스 번호는 몇개를 순서대로 나열해보자면 [0][0], [1][0], [2][0], [3][0], [4][0], [5][0], [0][1] ··· 이렇게 출력될 것 입니다. 그러므로 바깥쪽 for문의 범위는 0~14까지 돌려주고 안쪽은 계속 출력을 해줘야 하므로 0에서 4까지로 범위를 잡아주면 됩니다.

예외처리

문제가 뭐냐면 NULL 문자를 처리해 줘야합니다. 그렇기 때문에 위에서 설정한 범위 내에서 for문이 동작하면서 if(arr[i][j] == NULL) continue;를 해주면 예외처리가 되게 됩니다.

여기까지 이해를 다 하셨다는 가정하에 코드를 살펴 보겠습니다.

#include <stdio.h> #define MAX_NUMBER 15 char arr[5][15]; int main(void) { for (int i = 0; i < 5; ++i) scanf("%s", arr[i]); // 중요 for (int j = 0; j < MAX_NUMBER; ++j) { for (int i = 0; i < 5; ++i) { if (arr[i][j] == NULL) continue; else printf("%c", arr[i][j]); } } printf("\n"); return 0; }

매크로 함수를 통해 그냥 정의를 해줬고요.
위의 설명에서 동일하게 코드로 옮기는 작업만 했습니다.

후기…

제가 이 문제를 학교 정보올림피아드 반에서 했지만 저는 그 시간에 못 풀었기 때문에 지금 집에 와서 풀어봤는데요.
요즘 느끼는 거지만 너무 안했다라는 많이 듭니다… 왠지 모를 짜증도 들고요. 이런 간단한 문제도 못 푸는 저의 실력을 보면서 참 안쓰럽습니다. ㅋㅋ 그렇지만 저는 포기하지는 않을 겁니다. 제가 좋다고 해서 시작한 일이고, 떨어지더라도 끝까지 최선을 다하는 모습을 보여드리겠습니다.

 

'온라인저지' 카테고리의 다른 글

[BOJ]2783번: 삼각 김밥  (0) 2017.09.03
[BOJ] 2477번: 참외밭  (2) 2017.08.26
[BOJ]2476번: 주사위 게임  (0) 2017.08.26
[BOJ]2475번: 검증수  (0) 2017.08.26
[BOJ]1735번: 분수 합  (0) 2017.08.13
[BOJ]11507번: 카드셋트  (0) 2017.08.13

댓글