티스토리 뷰
728x90
반응형
백준 온라인 저지(BOJ) 4779번 칸토어 집합
https://www.acmicpc.net/problem/4779
* 사용언어 : C언어, C++
1. 문제
'-'가 3^N개 있는 문자열을 3등분 한 뒤 가운데 문자열을 공백으로 변경
공백 양 옆의 두 선을 3등분하고 공백으로 바꾸는 작업을 선의 길이가 1이 될 때 까지 반복
주어진 N에 대해 위 과정의 결과값을 출력
2. 풀이
재귀를 통해 절차를 반복하여 푸는 것이 핵심이지만
여러 개의 Test Case에서 동일한 절차를 반복하는 것은 적합하지 않은 것 같다고 보았습니다.
그래서 N의 최대값(12)에 따라 문자열을 3^12 크기로 선언하고,
N이 12일 때의 결과값을 재귀 함수를 활용하여 미리 처리하여 저장해두었습니다.
이후 N이 주어질 때마다 해당 되는 길이만큼만 출력하게 했습니다.
풀이 자체는 단순하니 아래 코드로 설명 대체하겠습니다.
매우 쉬운 문제라고 생각했었지만
저는 cantor 함수 내 index(s, e, m1, m2)를 처리하는 과정에서 실수가 많이 있었습니다.
배열의 index, 그리고 debug 모드에 익숙해질 필요가 있는 것 같습니다.
3. 코드
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
4779_칸토어 집합
2160KB 0ms
*/
#include <cstdio>
const int CLM = 531441; // 3^12
char str[CLM];
int cnts[13], N;
void cantor(int s, int e) {
if (s + 1 >= e) return;
int dist = (e - s + 1) / 3;
int m1 = s + dist;
int m2 = m1 + dist;
for (int i = m1; i < m2; ++i) str[i] = ' ';
cantor(s, m1);
cantor(m2, e);
}
int main() {
#ifdef _WIN32
freopen("input.txt", "r", stdin);
#endif // _WIN32
for (int i = 0; i < CLM; ++i) str[i] = '-';
cantor(0, CLM - 1);
int cnt = 1;
for (int i = 0; i < 13; ++i) {
cnts[i] = cnt;
cnt *= 3;
}
while (scanf("%d", &N) == 1)
printf("%.*s\n", cnts[N], str);
return 0;
}
* printf("%.*s", 길이, 문자열)로 문자열을 원하는 길이만큼만 출력할 수 있습니다.
728x90
반응형
'개발자 > 문제풀이 (C언어)' 카테고리의 다른 글
[백준/BOJ] 15649번 N과 M (1) (C/C++) (0) | 2024.01.19 |
---|---|
[백준/BOJ] 2447번 별 찍기 - 10 (C/C++) (0) | 2024.01.18 |
[백준/BOJ] 25501번 재귀의 귀재 (C/C++) (0) | 2024.01.08 |
[백준/BOJ] 10870번 피보나치 수 5 (C/C++) (0) | 2024.01.07 |
[백준/BOJ] 27433번 팩토리얼 2 (C/C++) (0) | 2024.01.06 |
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 내가틀릴수도있습니다
- 동탄에듀센터
- 쿠프마케팅
- 호암의마지막꿈
- 동탄에듀센터2
- 자동차보험
- 최재천의공부
- 긴 자리 덧셈 뺄셈
- 원서잡아먹는영작문
- 나는늘잘해야한다고생각한다
- AdSendse
- 인간본성불패의법칙
- 역사의쓸모
- 지루함의심리학
- 정올
- 독서감상평
- 정세현의통찰
- 독서 감상평
- 안전운전특약
- 센터독서클럽
- 자이언트임팩트
- 영화감상평
- 삼성전자
- 문현공
- 긴 자리 곱셈
- 당신도느리게나이들수있습니다
- JUNGOL
- 세상을 읽는 새로운 언어 빅데이터
- 나의첫죽음학수업
- 여가포인트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함