PS/백준

[BOJ] 2448 별 찍기 - 11 (C/C++)

uyt8989 2022. 9. 4. 14:38
 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net


본격적인 학기 시작 전에 여유가 조금 있어서 정말 오랜만에 PS를 했다. 저번 방학 + 학기 초까지는 꽤 열심히 했었는데, 학기가 바빠지고 이번 방학 때는 다른 활동을 하느라 한참 방치되어 있었다. 최근에 C++도 다루지 않았다 보니 평소보다 시간이 좀 더 걸렸던 것 같다.

 

이 문제는 분할 정복을 이용해서 푸는 문제였다. 문제에 주어진 24를 기준으로 설명하면, 큰 그림은 작은 그림 3개로 쪼갤 수 있다. 또 작은 그림은 더 작은 그림 3개로 쪼갤 수 있는 형태를 가졌다. 그래서 더 이상 쪼갤 수 없는 그림까지 쪼개면 문제를 해결할 수 있다.

 

문제 접근 방법은 간단했지만 구현 상에 문제가 몇가지 있었다. 첫 번째는 예전에 별 찍기를 풀었을 때는 그냥 바로바로 출력을 했던 것으로 기억한다. 그래서 가장 처음엔 그렇게 접근했었다. 하지만 이 문제는 그렇게 풀기는 어렵고 배열에 미리 그림을 그린 다음에 출력해야 했다.

 

첫 번째 문제를 해결하기 위해 배열을 사용하면서 두 번째 문제가 발생했다. 이 문제의 경우 빈 공간은 대충 null 문자로 출력하는 게 아니라 꼭 공백 문자를 사용해야 정답 인정을 받을 수 있다. 비주얼 스튜디오 상에서 테스트를 하면 생각보다 비주얼 스튜디오가 똑똑하기 때문에 문제를 발견하지 못하는 경우가 많다. 그래서 해당 문제에 대해서 세심하게 설정하고 나니 통과할 수 있었다. 

 

나는 매번 memset이 헷갈렸다. 지금까지는 주로 memset을 배열을 0으로 초기화하는데에 자주 사용했었고, 1로는 초기화하지 못한다고만 알고 있었다. 이번에 그 이유를 찾아보니 memset은 1 바이트 단위로 초기화하기 때문에 1 바이트로 표현하기 어려운 값들은 제대로 초기화되지 않는다고 한다. 1 같은 경우엔 int라 4 바이트이기 때문이다. 하지만 이 문제를 풀 당시에 memset에 대해서 정확히 알고 있지 않았기 때문에 memset을 사용해서 배열을 공백으로 초기화할 수 있는지 없는지에 대해 확신이 서지 않았다. 제대로 알고 있었다면 조금 더 시간을 줄일 수 있었을 것이다. 

 

최근에 유튜브에서 성장 정체기를 벗어날 수 있는 방법에 대한 영상을 봤다. 핵심은 뭔가 필요한 내용을 자꾸 뒤로 미루지 말고 그 당시에 해결하라는 것이었다. 뭐 아직 정체기가 올만큼 성장하지도 않았지만, 어디에서나 쓸모 있어 보이는 태도다.

 

 

'PS > 백준' 카테고리의 다른 글

[BOJ] 1068 트리  (4) 2022.09.30
[BOJ] 1715 카드 정렬하기  (0) 2022.09.27
[BOJ] 17837 새로운 게임 2 (C/C++)  (0) 2022.04.30
[BOJ] 19238 스타트 택시 (C/C++)  (2) 2022.04.27
[BOJ] 15685 드래곤 커브 (C/C++)  (0) 2022.04.26