본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[백준 알고리즘] 2438, 2439, 2440, 2441번 별찍기 문제

 

백준(BAEKJOON) 알고리즘 문제 풀기- 난이도: 하

반복문하면 맨날 나오는 단골 문제 별찍기~!

문제를 훑어보면 보이겠지만 다 비슷한 문제입니다. 

[2438번] 별 찍기-1

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

문제: 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제.

시간제한: 1초,  메모리 제한 128MB

입력: 첫째 줄에 N(1<= N <= 100)이 주어진다.

출력: 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

예시1

입력: 5

출력: 

*

**

***

****

*****

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

[2439번] 별 찍기-2

 

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

문제: 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제. 하지만 오른쪽을 기준으로 정렬한 별을 출력하시오.

시간제한: 1초,  메모리 제한 128MB

입력: 첫째 줄에 N(1<= N <= 100)이 주어진다.

출력: 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

예시1

입력: 5

출력: 

    *

   **

  ***

 ****

*****

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

 

[2440번] 별 찍기-3

 

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

문제: 첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ... , N번째 줄에는 별 1개를 찍는 문제.

시간제한: 1초,  메모리 제한 128MB

입력: 첫째 줄에 N(1<= N <= 100)이 주어진다.

출력: 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

예시1

입력: 5

출력: 

*****

****

***

**

*

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

 

[2441번] 별 찍기-4

 

 

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

문제: 첫째 줄에는 별 1개, 둘째 줄에는 별 N-1개, ... , N번째 줄에는 별 1개를 찍는 문제. 하지만 오른쪽을 기준으로 정렬한 별을 출력하시오.

시간제한: 1초,  메모리 제한 128MB

입력: 첫째 줄에 N(1<= N <= 100)이 주어진다.

출력: 첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

 

예시1

입력: 5

출력: 

*****

 ****

  ***

   **

    *

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

 

ANSWER

반복문을 하게 되면 고려해야 할게 뭐라했었죠?! 입출력속도예요. 

그 전 N찍기 문제에서 했었어요. <- 입출력속도 성능 안보고 오신 분은 확인하고 오기!

 

2438 별찍기-1 문제의 경우 

 규칙을 찾아보면 1행에 한 개, 2행에 두 개, 3행에 3 개, 4행에 4개... 즉 정비례 규칙을 갖습니다. 행을 row라고 했을 때 별의 개수(별의 반복문)는 1차함수와 같아요! 3행이면 별 찍는 것을 3번 반복해줘야 하는거죠! 행의 수 = 별 한개 찍기 반복 수 

그림으로 보면 빨간색 선은 열(y) = 행(x) 함수가 됩니다. 

따라서 저 별이 찍히는 조건은 '열<행'을 만족할 때, 

선까지 포함해서 '열<=행'을 만족할 때 찍히는 규칙을 가진다는 것을 알 수 있어요

 

 

2441 별찍기-4 문제의 경우

 

이 문제도 똑같습니다 똑같아요 다만 '열<=행'이 아니라이 문제는 보면 2438과 똑같은 데 영역이 아래가 아니라 위죠? 그리고 첫 열에, N개만큼 출력되니까 열이 N보다 작거나 같아야 한다는 것이 추가됐어요.

즉 '열>=행'일 때 "*"를 찍어주고 해당 조건이 아닐 경우, " "을 출력해주면 됩니다. 다만 최대 열은 N개예요.

 

 

 

2439 별찍기-2 문제의 경우

얘는 그림은 생략할게요 같은 맥락이니까~

1행에 1개 2행에 2개 이건 동일하지만 시작점이 다르죠?

1행은 별이 N열에 시작했다가 2행은 N-1열부터 시작했다가..  이걸 식으로 세워보면 col=N-row+1 이렇게 되네요 

그런데 이건 시작점인거니 이 col이후도 별로 채워져야겠죠? 즉 별이 찍힌 col은 'col>=N-row+1'이 됩니다. 

이걸 좀 더 간단하기 col>N-row로 쓸 수 있겠죠?

 

2440은 매우 쉬우니 여러분이 함 해보는걸로!

 

[C언어] 문제: 2438

#include <stdio.h>
int main()
{
    int N;
    scanf("%d", &N);
    for(int row=1; row<=N; row++)
    {
        for(int col=1; col<=row; col++)
        {
            printf("*");
        }
        printf("\n");
    }
}

메모리: 1116KB

시간: 0ms

코드 길이: 231B

 

[C++]  문제: 2438, 2439, 2440, 2441번

#include <iostream>
using namespace std;
int main()
{
    int N;
    cin>>N;
    //2438번
    for(int row=1; row<=N; row++)
    {
        for(int col=1; col<=row; col++)
        {
            cout<<"*";
        }
        cout<<"\n";
    }
    //2439번
     for(int row=1; row<=N; row++)
    {
        for(int col=1; col<=N; col++)
        {
            if(col>N-row)
                cout<<"*";
            else
                cout<<" ";
        }
        cout<<"\n";
    }
    //2440번 
    for(int row =1; row<=N; row++)
    {
        for(int col=N-row+1; col>0; col--)
        {
            cout<<"*";
        }
        cout<<"\n";
    }
    //2441번
    for(int row=1; row<=N; row++)
    {
        for(int col=1; col<=N; col++)
        {
            if(col>=row)
                cout<<"*";
            else
                cout<<" ";
        }
        cout<<"\n";
    }
}

메모리: 1984KB

시간: 0ms

코드 길이: 2440번 - 260B / 2438번- 228B / 2441번 - 330B / 2439번 - 336B

 

[Java] 문제: 2438

import java.util.Scanner;
class Main{
    public static void main(String args[])
    {
        Scanner sc = new Scanner(System.in);
        int N= sc.nextInt();
        
        for(int row=1; row<=N; row++)
        {
            for(int col=1; col<=row; col++)
            {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

메모리: 15200KB

시간: 152ms

코드 길이: 396B

 

[Java] 문제: 2439

여윽시~ 느린 우리 시스아웃~ 

Scanner는 input이 하나밖에 없으니까 그냥 내비두고 Sysout을 좀 더 빠른 BufferedWriter로 바꿔서 2439문제를 풀어봅시다

import java.util.Scanner;
import java.io.*;
class Main{
    public static void main(String args[]) throws IOException{
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        for(int row=1; row<=N; row++){
            for(int col=1; col<=N; col++){
                if(col>N-row){
                    bw.write("*");
                }else{
                    bw.write(" ");
                }
            }
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }
}

메모리: 14520KB

시간: 108ms

코드 길이: 621B 

 

오늘은 여기까지입니다. 고생하셨어요 :)