https://programmers.co.kr/learn/courses/30/lessons/12969?language=javascript 

 

코딩테스트 연습 - 직사각형 별찍기

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다. 별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요. 제한 조건 n과 m은 각각 1000 이하인 자연수

programmers.co.kr

문제 설명

이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.


제한 조건
  • n과 m은 각각 1000 이하인 자연수입니다.

예시

입력

5 3

출력

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

 

 

풀이 

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]); 
    
    for(let i = 0; i < b; i++) { // b = 3 3번 반복 
        let str = "";  // * 저장할 변수 지정 
        for(let j = 0; j < a; j++) { // a = 5, 5번 반복 
            str = str + "*";  // 5번 출력 
        }
        console.log(str); // 출력 
      }
    
});

 

다른 풀이 

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]); 
    
    const str = "*".repeat(a); // repeat를 써서 5번 출력 
    for(let i = 0; i < b; i++) { // for 3전까지 출력 
        console.log(str);  // for 0번째 일 때 str(*****)출력 for 1번째일 때 str또 출력
    }
    
});

 

www.acmicpc.net/problem/10995

 

10995번: 별 찍기 - 20

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 차례대로 별을 출력한다.

 

 

바로 소스코드를 보시겠습니다.

#include <iostream>

using namespace std;

int main() 
{
    int N;
    cin >> N;

    for(int i = 0; i < N; i++)
    {
        if(i % 2 == 1)
            cout<<" ";
    
        for(int j = 0; j < N; j++)
        {
            cout<<"* ";
        }
        cout<<endl;
    }
}

 

풀이를 말씀드리자면

첫 번째로 i=0일 때 if문은 지나칩니다. 0 % 2 = 0이기때문에 지나치고 j = 0 에서 j < 2; j ++ 에서 총 두 번을 실행해야 되기 때문에 * *가 나옵니다.

두 번째로 i =1 일 때 if문을 한 번 실행하죠? 한 칸을 띄어준다음에 j를 두번 실행합니다.

그러면 첫 번째 실행햇을 때는 * * 가나오고 두 번째 실행했을 때는 (한 칸 띄어줌) *  *가 나옵니다.

 

이상 포스터를 마치겠습니다.

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

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

 

소스코드는 다음과 같습니다.

#include <iostream>

using namespace std;

int main()
{
    int N; 
    cin >> N; //N = 2일 때 , 

    for(int i = 1; i <= N; i++)  i = 1 <= N(2);  ----- 1  
    {
        for(int j = i;j<= N - 1; j++)  // j = 1 ,  j <= N(2) -1 = 1   --- 2 
        {
            cout<<" "; // 1번 실행  -- 3 
        }
        for(int j = 1 ; j <= i *2 - 1; j++) // j = 1 <= 1 * 2 - 1 = 1; --- 4   
        {
            if(j % 2 == 1)  // 1 % 2 == 1 * 출력  즉, " *"  ---- 5 
                cout<< "*"; --- 6 
            else
                cout<<" ";
        }
        cout<<endl; // 다시 맨 위로 올라갑니다. i = 2일 때로 시작합니다. --- 7 
    }
}

 

저도 아직 부분한 점이 많아 이런식으로 이해하려고 합니다. 입출력 문제는 30분이상 넘기면 안 될 것 같아서 다른사람의 해설, 문제풀이를 보면서 이해합니다.

 

이상 포스터를 마치겠습니다. 감사합니다.

www.acmicpc.net/problem/2446

 

2446번: 별 찍기 - 9

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

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

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

 

결과는 다음과 같습니다.

 

소스코드는 다음과 같습니다.

#include <iostream>

using namespace std;

int main()
{
    int N;
    cin >> N;

    for(int i=0; i < N; i++)
    {

        for(int j = 0; j < i; j++)
            cout<<" ";
        for(int j =0; j < N - i; j++)
            cout<<"*";
        for(int j = 0; j < N -i -1; j++ )
            cout<<"*";

        cout<<endl;
    }

    for(int i = 1; i < N; i++)
    {
        for(int j = 1; j < N - i; j++)
            cout<<" ";
        for(int j = 0; j < i+1; j++)
            cout<<"*";
        for(int j = 0; j < i; j++)
            cout<<"*";
        cout<<endl;
    }
}

 

아직 제가 실력이 많이 부족해 public, private, 오버라이딩 등을 사용해서는 구현은 못 하겠습니다. 계속 공부를 하면서 배워가면서 추후 더 좋은 소스와 좋은 내용으로 말씀드리겠습니다.

 

이번 문제에도 위에 별을 먼저 생각하고 그 후에 밑에 별을 출력할 생각을 했습니다.

 

이상 포스터를 마치겠습니다.

www.acmicpc.net/problem/2522

 

2522번: 별 찍기 - 12

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

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

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

 

 

 

소스코드는 다음과 같습니다.

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;

    for(int i = 1; i<=n; i++) 
    {
        for(int j = 0; j < n -i; j++)
            cout<<" ";
        for(int j =0; j < i; j++)
            cout<<"*";
        
    cout<<endl;
    }
    for(int i =1; i < n; i++) //  0 1, 2
    {
        for(int j = 0; j <i; j++ ) // j=1 ,  1 < i
            cout<<" ";
        for(int j = 0; j < n -i; j++)
            cout<<"*";

            
        cout<<endl;
    }
}

 

이거 또한 2445번의 별 찍기-8 처럼 위의 별을 먼저 풀고 다음 밑에 별을 먼저 풀면 쉽게 풀 수 있을 것 같습니다.

 

만약 이해가 되질 않는다면 직접 for문을 써서 출력해보고 이해하시길 바랍니다.(저도 아직 초보입니다.)

 

피드백 이나 더 좋은 소스코드가 있으면 대환영입니다!!!

 

 

이상 포스터를 마치겠습니다. 감사합니다.

 

www.acmicpc.net/problem/2445

 

2445번: 별 찍기 - 8

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

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

출력

첫째 줄부터 2xN-1번째 줄까지 차례대로 별을 출력한다.

 

다음과 같이 출력

 

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;

    for(int i=0; i < n - 1; i++)
    {
        for(int j =0; j < i + 1; j++)
            cout<<"*";
        for(int j = 0; j < 2*(n-i-1); j++)
            cout<<" ";
        for(int j = 0; j < i+1; j++)
            cout<<"*";
    
        cout<<endl;
    }

    for(int x = 0; x < n; x++)
    {
        for(int y = 0;  y < n - x; y++)
            cout<<"*";
        for(int z = 0; z < x + x; z++)
            cout<<" ";
        for(int y = 0; y < n - x; y++ )
            cout<<"*";

        cout<<endl;
    }
}

 

이번 알고리즘이 어렵다면 위에서부터 차례대로 풀어보시면 될 것 같아요

즉, 별 10개있는 곳을 가운대로 짤라놓고 앞에 있는 것부터 푸는 방법이 좋을 것 같습니다.

 

이상 포스터를 마치겠습니다.

문제

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

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

 

입력

첫째 줄에 N(1 ≤ N ≤ 1)이 주어진다.

출력

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

 

 

바로 소스코드 보겠습니다.

#include <iostream>

using namespace std;

int main()
{
    int a;
    cin >> a;
    for(int i=0; i<a; i++) 
    {
        for(int j=0; j<i; j++)
        {
            cout<<" ";
        }
        for(int j=0; j<a-i; j++)
        cout<<"*";

    cout<<"\n";
    }
}

 

해설은 첫 번째 for문에서 5개를 출력합니다. 두 번째 for문에서는 j(0) < i(0) 처음 for문은 건너 뛰겠죠?

세 번째 fot문에서 j(0) <(a(5)-(0) -> 다 섯개 출력 뭐 이런식으로 해석하시면 될 것 같네요.

 

딱히 어려운 문제는 아니니 생각하시면서 풀면 될 것 같아요 그렇다고 30분 이상 고민하는 건 비추입니다.(개인적인 생각)

입출력 문제는 30분 이상 고민하지 마세요.

 

이상 포스터를 마치겠습니다.

 

오늘은 백준 알고리즘 1924번 문제인 2007년을 풀어보도록 하겠습니다.

 

www.acmicpc.net/problem/1924

 

1924번: 2007년

첫째 줄에 빈 칸을 사이에 두고 x(1≤x≤12)와 y(1≤y≤31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

www.acmicpc.net

문제

오늘은 2007년 1월 1일 월요일이다. 그렇다면 2007년 x월 y일은 무슨 요일일까? 이를 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 빈 칸을 사이에 두고 x(1≤x≤12)와 y(1≤y≤31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

출력

첫째 줄에 x월 y일이 무슨 요일인지에 따라 SUN, MON, TUE, WED, THU, FRI, SAT중 하나를 출력한다.

 

 

소스코드로 풀이를 보시면 될 것 같습니다. 여기서 어떻게 저런 로직이 나올까? 라는 생각을 하실 수가 있어서 count, count2라는 것을 나와서 출력을 하게끔 만들었습니다.

 

소스코드 보시겠습니다.

 

#include <iostream>
#include <string>

using namespace std;

int main() 
{
     int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 달 
     string day[7] =  { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" }; // 문자열의 일수 
     int count1 = 0; // 총 계산값 
     int x, y;

     cin >> x >> y; // ex) 12월 25일로 가정합니다. 
    
    if (x >12 || x < 1 || y > 31 || y < 1) 
            return 0;
    
    for(int i=0; i<x; i++) // x: 12로 가정. 
    {
        if((i + 1) == x)  // 첫번째 포문은 (0 + 1 ) == 12 성립하지 않습니다. 그렇기 때문에 else로 넘어 갑니다. ----- 1 
        {
            count1 += y;  //아까 총 count2값이 :334입니다 +y해주시면 334+25 = 359입니다. -- 4
            cout<<"count : "<<count1<<endl; 
        }
        else 
        {
            count1 += month[i]; //moth[0] = 31 , month [1] = 28 :: 12까지니 31까지 더하겠죠 ? -- 2
             cout<<"count2 : "<<count1<<endl; // 총 더한 값 출력 값.  334가 됩니다. 이제 if문으로 갑니다. -- 3  

        }
    }
 
    cout<<day[count1 % 7 ] <<endl; // day[359 % 7 ] = 2이죠 : day[2] = TUE --- 5 

    return 0;


}

 

다음으로는 왜 count가 그렇게 나오는 지에 대한 출력입니다. 생각해보시면 왜 저런 답이 나왔는지 아실거에요!

여기서 count2 : else문이고 count는 if문입니다.

 

 

 

이상 포스터를 마치겠습니다.

 

+ Recent posts