본문 바로가기

Algorithm/BOJ

[BOJ] 2422 별 찍기 - 5

이걸 이렇게 오래 붙잡고 있을 줄이야.....

 

c언어에서 정말 구멍이 많음을 느낀다.

for문으로 하는 단순한 방법 말고 이전에 교재에서 공부했던 재귀 방식으로 코드를 짜려고 하는데 계속해서 오류가 나서 도대체 뭔가 했다.

 

우선 string형이 c언어에는 없어서 직관적이지가 않았다. 자바로만 워낙에 쉽게쉽게 해버렸으니

str관련 함수를 많이 알아냈다.

그리고 무엇보다 중요한 건 복사를 해줘도 기존에 값은 그대로 저장되고 그 앞에 짧은 값만 복사가 돼서 값의 길이가 계속 그대로였다. str형은 마지막에 무조건 \0을 붙여줘야 문장이 끝나는 걸 알아야 한다.

str관련 함수는 이번 기회에 잘 알아갔으면 좋겠다. 

그리고 c++에서는 굳이 이렇게 하지 않아도 String형이 존재한다는 것을 코드를 다 짠다음에 알아버렸다.

 

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int N;

void solve_for(int n){

    int blank = n-1;

    for(int stair = 1 ; stair <= n ; stair++){
        for(int blank_index =0 ; blank_index < blank ; blank_index ++)
            cout << " " ;
        for(int star_index = 0; star_index < stair*2 -1 ; star_index++ )
            cout << "*" ;

        blank--;
        cout << endl ;

    }
}
char star[2 * 100 - 1];
char blank[2 * 100 - 1];
char blank_temp[2 * 100 - 1];

void solve_array(int n){
    if( n > 0 ){

        solve_array(n - 1);

        strncpy(blank_temp, blank, N-n);        //blank 중 일부만 복사해옴
        blank_temp[N-n] = '\0'; //마지막 EOF 설정 안해주면 기존에 값 그대로 저장된 상태임, 길이 그대로임

        fputs(blank_temp,stdout);
        fputs(star, stdout);
        puts("");

        strcat( star, "**" );


    } else
        return;

}


int main() {
    cin >>  N;
    for(int i =0 ; i< N-1; i++)
        blank[i] = ' ';

    strcat(star,"*");
    solve_array(N);
    solve_for(N);

    return 0;
}

 

 

 

 

이걸 푸는데 3시간이 걸린 나란 존재 칭찬하다. 처음 출력형식이 틀렸다는 것은 뒤에 공백을 출력하지 않아도 되는데 출력을 해서 틀렸다는 것이었다. 그렇게 늪으로... 그래도 정답이라는 초록색 글씨가 뜨니 기분이 풀렸다. 절망하지 말고 정진하자..

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 2261 가장 가까운 두 점  (0) 2021.03.24
[BOJ] 9466 텀 프로젝트  (0) 2021.03.03
[BOJ] 2331 반복수열  (0) 2021.03.01
[BOJ] 2110 공유기 설치  (0) 2021.03.01
[BOJ] 1707 이분 그래프  (0) 2021.02.26