길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm

[백준 2448번] 별 찍기 - 11 (C/C++)

2022. 3. 4. 17:34

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

 

2448번: 별 찍기 - 11

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

www.acmicpc.net


개행 때문에 고민이 필요했던 문제였습니다.

개행은 배열을 이용하여 해결하였습니다.

재귀 시작 전 배열을 공백 문자로 채워주고, 각각의 재귀는 맡은 범위에 삼각형 형태의 별을 저장해주면 됩니다.

 

재귀 함수 탈출 조건은 가장 작은 삼각형을 기준으로 작성하였습니다.

우측 하단의 꼭짓점과 좌측 하단의 꼭짓점의 y좌표 차이가 4이면 가장 작은 삼각형이므로, 재귀 함수의 입력으로 받은 세 꼭짓점을 기준으로 삼각형 형태의 별을 저장해줍니다. 

     *     
    * *    
   *****

가장 작은 삼각형이 아닌 경우, 상단의 삼각형, 하단 좌측, 하단 우측의 삼각형에 대한 재귀를 각각 호출합니다. 

     *     
    * *    
   *****   
  *     *  
 * *   * * 
***** *****

전체 코드는 아래와 같습니다. 

#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second

// 가장 하단의 별의 개수는 n / 3
// 가장 하단 줄의 수는 5 * (n/3) + (n/3-1)
// n의 최대값은 3072 -> 최하단 줄의 최대 길이는 5 * (3072 / 3) + (3072/3-1) = 6143

char board[3072][6143];

void star(pair<int, int> pos1, pair<int, int> pos2, 
          pair<int, int> pos3){ // pos1은 삼각형 상단의 꼭짓점, pos2는 하단 좌측, pos3는 하단 우측
          
    if(pos3.y - pos2.y == 4){
    	// 첫번째 줄
        board[pos1.x][pos1.y] = '*';	
        // 두번째 줄
        board[pos1.x + 1][pos2.y + 1] = '*'; board[pos1.x + 1][pos3.y - 1] = '*'; 
        // 세번째 줄
        for(int i = pos2.y; i <= pos3.y; i++) board[pos2.x][i] = '*'; 
    }else{
        star(pos1, {(pos1.x + pos2.x) / 2, (pos1.y + pos2.y)/2 + 1}, 
        {(pos1.x + pos2.x) / 2, (pos1.y + pos3.y)/2}); // 상단의 삼각형
        
        star({(pos1.x + pos2.x) / 2 + 1, (pos2.y + pos1.y)/2}, 
        {pos2}, {pos2.x, pos1.y - 1});   //   하단 좌측
        
        star({(pos1.x + pos2.x) / 2 + 1, (pos1.y + pos3.y)/2 + 1}, 
        {pos2.x, pos1.y + 1}, {pos3});   // 하단 우측
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n; cin >> n;
    fill(&board[0][0], &board[3071][6143], ' ');	// 공백 문자로 2차원 배열 초기화
    star({0, (5*(n/3)+(n/3-1)-1) / 2}, {n-1, 0}, {n-1, 5*(n/3)+(n/3-1)-1});

    for(int i = 0; i < n; i++){
        for(int j = 0; j < 5 * (n/3) + (n/3-1); j++)
            cout << board[i][j];
        cout << "\n"; 
    }
}

'Algorithm' 카테고리의 다른 글

[백준 18809번] Gaaaaaaaaaarden (C/C++)  (0) 2022.03.11
[백준 1941번] 소문난 칠공주 (C/C++)  (0) 2022.03.11
[백준 15655번] N과 M (9) (C/C++)  (0) 2022.03.09
[백준 1182번] 부분수열의 합 (C/C++)  (0) 2022.03.09
[백준 9663번] N-Queen (C/C++)  (0) 2022.03.08
    'Algorithm' 카테고리의 다른 글
    • [백준 1941번] 소문난 칠공주 (C/C++)
    • [백준 15655번] N과 M (9) (C/C++)
    • [백준 1182번] 부분수열의 합 (C/C++)
    • [백준 9663번] N-Queen (C/C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바