본문 바로가기

BOJ/Node.js

[BOJ / Node.js] 4779. 칸토어 집합

728x90

https://www.acmicpc.net/problem/4779

 

4779번: 칸토어 집합

칸토어 집합은 0과 1사이의 실수로 이루어진 집합으로, 구간 [0, 1]에서 시작해서 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만든다. 전체 집합이 유한이라고 가정하고,

www.acmicpc.net

 

문제

칸토어 집합은 0과 1사이의 실수로 이루어진 집합으로, 구간 [0, 1]에서 시작해서 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만든다.

전체 집합이 유한이라고 가정하고, 다음과 같은 과정을 통해서 칸토어 집합의 근사를 만들어보자.

1. -가 3N개 있는 문자열에서 시작한다.

2. 문자열을 3등분 한 뒤, 가운데 문자열을 공백으로 바꾼다. 이렇게 하면, 선(문자열) 2개가 남는다.

3. 이제 각 선(문자열)을 3등분 하고, 가운데 문자열을 공백으로 바꾼다. 이 과정은 모든 선의 길이가 1일때 까지 계속 한다.

예를 들어, N=3인 경우, 길이가 27인 문자열로 시작한다.

---------------------------

여기서 가운데 문자열을 공백으로 바꾼다.

---------         ---------

남은 두 선의 가운데 문자열을 공백으로 바꾼다.

---   ---         ---   ---

한번 더

- -   - -         - -   - -

모든 선의 길이가 1이면 멈춘다. N이 주어졌을 때, 마지막 과정이 끝난 후 결과를 출력하는 프로그램을 작성하시오.

입력

입력을 여러 줄로 이루어져 있다. 각 줄에 N이 주어진다. 파일의 끝에서 입력을 멈춘다. N은 0보다 크거나 같고, 12보다 작거나 같은 정수이다.

출력

 

입력으로 주어진 N에 대해서, 해당하는 칸토어 집합의 근사를 출력한다.

예제 입력

0
1
3
2

예제 출력

-
- -
- -   - -         - -   - -
- -   - -

 

Solve

  • base case를 n === 1 로 설정하고, base case일 경우 " - "를 리턴하도록 하였습니다.
  • 재귀적으로 해결하기 위해 문제를 작은 단위로 쪼개고, "문자열" - "공백" - "문자열" 형태로 반복된 다는 것을 이용하였습니다.

아이디어 끄적이기

Code

const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const arr = input.map(el=>+el);

const solution = (n) => {

    if(n === 1) return "-";

    let newStr = "";
    const divideThree = Math.floor(n/3);


    newStr += solution(divideThree);
    newStr += " ".repeat(divideThree);
    newStr += solution(divideThree);

    return newStr;
}



for(let i = 0 ; i < arr.length; i++) {
    console.log(solution(3**arr[i]));
}

'BOJ > Node.js' 카테고리의 다른 글

[BOJ / Node.js] 2110. 공유기 설치  (0) 2023.03.02
[BOJ / Node.js] 2343. 기타 레슨  (0) 2023.03.01
[BOJ / Node.js] 17829 222-풀링  (0) 2023.02.27
[BOJ / Node.js] 12919. A와 B 2  (0) 2023.02.27
[BOJ / Node.js] 3273. 두 수의 합  (0) 2023.02.25