반응형

[2438]별 찍기 - 1

예제 입력 1 
5

예제 출력 1 
*
**
***
****
*****
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int N;
  cin >> N;

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

 

[2439]별 찍기 - 2

예제 입력 1 
5
예제 출력 1 
    *
   **
  ***
 ****
*****
#include <bits/stdc++.h>
using namespace std;

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

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

[2440]별 찍기 - 3

예제 입력 1 
5
예제 출력 1 
*****
****
***
**
*
#include <bits/stdc++.h>
using namespace std;

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

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

[2441]별 찍기 - 4

예제 입력 1 
5
예제 출력 1 
*****
 ****
  ***
   **
    *
#include <bits/stdc++.h>
using namespace std;

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

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

[2442]별 찍기 - 5

예제 입력 1 
5
예제 출력 1 
    *
   ***
  *****
 *******
*********

 

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

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

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

[2443]별 찍기 - 6

예제 입력 1 
5
예제 출력 1 
*********
 *******
  *****
   ***
    *
#include <bits/stdc++.h>
using namespace std;

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

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

[2444]별 찍기 - 7

예제 입력 1 
5
예제 출력 1 
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
반응형

'Algorithm > 구현-기하학' 카테고리의 다른 글

[c++]baekjoon 2477 참외밭  (0) 2021.06.05
[c++]baekjoon 2166 다각형의 면적  (0) 2021.06.05
반응형

2747 피보나치 수

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

 

풀이 

아래 코드 입력 시 시간 초과 발생한다. 

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

int fibo(int a)
{
    if( a == 0) 
        return 0;
    else if(a ==1)
        return 1;
    else
        return (fibo(a-1) + fibo(a-2));
}

int main()
{
    int repeat; 
    cin >> repeat;
	cout << fibo(repeat);

	return 0;
}

아래와 같이 dynamic programming방식으로 풀어서 시간초과를 없앴다.

/*[baekjoon][2747] 피보나치 수*/
#include <bits/stdc++.h>
using namespace std;
int d[50];

int fibonacci(int n)
{
    if( n == 0) return 0; 
    else if(n ==1) return 1;
    else if(d[n] != 0) return d[n];
    return d[n]=(fibonacci(n-1) + fibonacci(n-2));
}

int main()
{
    int n; 
    cin >> n;
	cout << fibonacci(n);

	return 0;
}
/*[baekjoon][2747] 피보나치 수*/

 

2748 피보나치 수 2

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

 

/*[baekjoon][2748] 피보나치 수 2*/
#include <bits/stdc++.h>
using namespace std;
long long int d[100];

long long int fibonacci(int n)
{
    if( n == 0) return 0; 
    else if(n ==1) return 1;
    else if(d[n] != 0) return d[n];
    return d[n]=(fibonacci(n-1) + fibonacci(n-2));
}

int main()
{
    int n; 
    cin >> n;
	cout << fibonacci(n);

	return 0;
}
/*[baekjoon][2748] 피보나치 수 2*/

 

2749 피보나치 수 3

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력한다.

예제 입력 1 복사

1000

예제 출력 1 복사

228875

반응형
반응형

2747 피보나치 수

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

 

풀이 

아래 코드 입력 시 시간 초과 발생한다. 

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

int fibo(int a)
{
    if( a == 0) 
        return 0;
    else if(a ==1)
        return 1;
    else
        return (fibo(a-1) + fibo(a-2));
}

int main()
{
    int repeat; 
    cin >> repeat;
	cout << fibo(repeat);

	return 0;
}

아래와 같이 dynamic programming방식으로 풀어서 시간초과를 없앴다.

/*[baekjoon][2747] 피보나치 수*/
#include <bits/stdc++.h>
using namespace std;
int d[50];

int fibonacci(int n)
{
    if( n == 0) return 0; 
    else if(n ==1) return 1;
    else if(d[n] != 0) return d[n];
    return d[n]=(fibonacci(n-1) + fibonacci(n-2));
}

int main()
{
    int n; 
    cin >> n;
	cout << fibonacci(n);

	return 0;
}
/*[baekjoon][2747] 피보나치 수*/

 

2748 피보나치 수 2

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

 

/*[baekjoon][2748] 피보나치 수 2*/
#include <bits/stdc++.h>
using namespace std;
long long int d[100];

long long int fibonacci(int n)
{
    if( n == 0) return 0; 
    else if(n ==1) return 1;
    else if(d[n] != 0) return d[n];
    return d[n]=(fibonacci(n-1) + fibonacci(n-2));
}

int main()
{
    int n; 
    cin >> n;
	cout << fibonacci(n);

	return 0;
}
/*[baekjoon][2748] 피보나치 수 2*/

 

2749 피보나치 수 3

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력한다.

예제 입력 1 복사

1000

예제 출력 1 복사

228875

반응형
반응형

2747 피보나치 수

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 45보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

 

풀이 

아래 코드 입력 시 시간 초과 발생한다. 

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

int fibo(int a)
{
    if( a == 0) 
        return 0;
    else if(a ==1)
        return 1;
    else
        return (fibo(a-1) + fibo(a-2));
}

int main()
{
    int repeat; 
    cin >> repeat;
	cout << fibo(repeat);

	return 0;
}

아래와 같이 dynamic programming방식으로 풀어서 시간초과를 없앴다.

/*[baekjoon][2747] 피보나치 수*/
#include <bits/stdc++.h>
using namespace std;
int d[50];

int fibonacci(int n)
{
    if( n == 0) return 0; 
    else if(n ==1) return 1;
    else if(d[n] != 0) return d[n];
    return d[n]=(fibonacci(n-1) + fibonacci(n-2));
}

int main()
{
    int n; 
    cin >> n;
	cout << fibonacci(n);

	return 0;
}
/*[baekjoon][2747] 피보나치 수*/

 

2748 피보나치 수 2

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

예제 입력 1 복사

10

예제 출력 1 복사

55

 

/*[baekjoon][2748] 피보나치 수 2*/
#include <bits/stdc++.h>
using namespace std;
long long int d[100];

long long int fibonacci(int n)
{
    if( n == 0) return 0; 
    else if(n ==1) return 1;
    else if(d[n] != 0) return d[n];
    return d[n]=(fibonacci(n-1) + fibonacci(n-2));
}

int main()
{
    int n; 
    cin >> n;
	cout << fibonacci(n);

	return 0;
}
/*[baekjoon][2748] 피보나치 수 2*/

 

2749 피보나치 수 3

더보기
더보기

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 1,000,000,000,000,000,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 1,000,000으로 나눈 나머지를 출력한다.

예제 입력 1 복사

1000

예제 출력 1 복사

228875

반응형
반응형
더보기

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

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

출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.

예제 입력 1 
18
예제 출력 1 
4
예제 입력 2 
4
예제 출력 2 
-1
예제 입력 3 
6
예제 출력 3 
2
예제 입력 4 
9
예제 출력 4 
3
예제 입력 5 
11
예제 출력 5 
3

 

이 문제는 동적 계획법 문제로 풀어야 한다. 

 

/*baekjoon 2839 설탕 배달*/
#include <iostream>
using namespace std;
int N; // 설탕 무게 

void InputData(){
    cin >> N;
}
void Solve()
{
    int total = 0;
    int tmp = 0;

    if( N%5 == 0 ){
        cout <<  N/5 << endl;
    }else{
        tmp = N/5;
        do{
            if((N - tmp*5)%3 == 0){
                cout << tmp + (N -5*tmp)/3 << endl;
                break; 
            }
            tmp--;
            }while(tmp >=0 );
    }
    if( tmp == -1 )
    cout << "-1" << endl;
}
int main()
{
    InputData();
    Solve();
    return 0;
}
/*baekjoon 2839 설탕 배달*/
반응형

'Algorithm > 동적계획법(dynamic programming)' 카테고리의 다른 글

[c++][baekjoon]1912 연속합  (0) 2022.05.09
[c++][baekjoon]1912 연속합  (0) 2022.05.08
반응형

문제

체스판 위에 한 나이트가 놓여져 있다. 나이트가 한 번에 이동할 수 있는 칸은 아래 그림에 나와있다. 나이트가 이동하려고 하는 칸이 주어진다. 나이트는 몇 번 움직이면 이 칸으로 이동할 수 있을까?

입력

입력의 첫째 줄에는 테스트 케이스의 개수가 주어진다.

각 테스트 케이스는 세 줄로 이루어져 있다. 첫째 줄에는 체스판의 한 변의 길이 l(4 ≤ l ≤ 300)이 주어진다. 체스판의 크기는 l × l이다. 체스판의 각 칸은 두 수의 쌍 {0, ..., l-1} × {0, ..., l-1}로 나타낼 수 있다. 둘째 줄과 셋째 줄에는 나이트가 현재 있는 칸, 나이트가 이동하려고 하는 칸이 주어진다.

출력

각 테스트 케이스마다 나이트가 최소 몇 번만에 이동할 수 있는지 출력한다.

 

예제 입력 1 
3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

예제 출력 1 
5
28
0

 

풀이

1)입력은

T: 테스트 케이스 

N : 체스판의 한변의 길이

sy,sx : 나이트 시작 좌표

ey,ex : 나이트 목적지 좌표 

2)풀이 핵심은 

dy,dx를 그림과 같이 이동하는 경우를 모두 표시해 두는 게 가장 중요하다. 

그리고 나머지는 기존 bfs를 이용한 방법과 동일 하다 

/*[baekjoon]7562 나이트의 이동*/
#include <bits/stdc++.h>
using namespace std;
#define MAXN ((int) 3e2)
int Map[MAXN+10][MAXN+10];
bool visited[MAXN+10][MAXN+10];
int T;//test case
int N;//Map size
int sy,sx,ey,ex;
int dy[]={2,1,2,1,-2,-1,-2,-1};
int dx[]={1,2,-1,-2,-1,-2,1,2};
bool inRange(int x, int y){
    return ( (x>=0) && (x<N) && (y>=0) && (y<N));
}

void BFS(int y, int x){
    int ny,nx;
    queue <pair<int,int>> q;
    q.push(make_pair(y,x));
    visited[y][x]=true;

    while(!q.empty()){
        y=q.front().first;
        x=q.front().second;
        q.pop();
        if((y==ey) && (x==ex)) break;
        for(int i=0; i<8; i++){
            ny=y+dy[i];
            nx=x+dx[i];
            if(inRange(ny,nx) && !visited[ny][nx]){
                visited[ny][nx]=true;
                Map[ny][nx]=Map[y][x]+1;
                q.push(make_pair(ny,nx));
            }
        }

    }

}
void InputData(){
    cin >> T;
}
void Solve(){
    for(int i=0; i<T; i++){
        cin >> N;
        cin >> sy >> sx >> ey >> ex ;
        BFS(sy,sx);
        cout << Map[ey][ex] << endl;
        memset(Map, false, sizeof(Map));
        memset(visited, false, sizeof(visited));
    }
}
int main(){
   InputData();
   Solve();
   return 0;
}
/*[baekjoon]7562 나이트의 이동*/
반응형
반응형

문제

철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자모양 상자의 칸에 하나씩 넣은 다음, 상자들을 수직으로 쌓아 올려서 창고에 보관한다.

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토에 인접한 곳은 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지 그 최소 일수를 알고 싶어 한다.

토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다.

입력

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, 1 ≤ H ≤ 100 이다. 둘째 줄부터는 가장 밑의 상자부터 가장 위의 상자까지에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 하나의 상자에 담긴 토마토의 정보가 주어진다. 각 줄에는 상자 가로줄에 들어있는 토마토들의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0 은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다. 이러한 N개의 줄이 H번 반복하여 주어진다.

토마토가 하나 이상 있는 경우만 입력으로 주어진다.

출력

여러분은 토마토가 모두 익을 때까지 최소 며칠이 걸리는지를 계산해서 출력해야 한다. 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다.

 

예제 입력 1 
5 3 1
0 -1 0 0 0
-1 -1 0 1 1
0 0 0 1 1
예제 출력 1 
-1

예제 입력 2 
5 3 2
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
예제 출력 2 
4

예제 입력 3 
4 3 2
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
-1 -1 -1 -1
1 1 1 -1
예제 출력 3 
0

풀이 

1. 입력 : 1인 모든 좌표를 queue에 push

2. queue에서 하나씩 꺼내서 상하좌우,위,아래 6개 방향을 확인해서 1이 있는 지 확인한다.

3. 

/*baekjoon 7569 토마토 BFS*/
#include <iostream>
#include <queue>
using namespace std;
#define max ((int)1e2+5)

int M,N,H ;//가로, 세로,상자수 
int map[max][max][max];
bool mapCheck[max][max][max];
int path[max][max][max];
int cnt;
int dz[6] = {0,0,0,0,-1,1};
int dy[6] = {-1,1,0,0,0,0};
int dx[6] = {0,0,1,-1,0,0};
struct Q{
	int z,y,x;
};
Q cur;
queue<Q>q;

bool isInside(int z, int y,int x){
    return ((z>=0 && z<H) && (y>=0 && y<N) && (x>=0 && x<M));
}

void Solve(){
    int nx,ny,nz;
    while(!q.empty()) {
        cur=q.front();
        q.pop();

        for (int i = 0; i < 6; i++) {
            nz = cur.z + dz[i];
            ny = cur.y + dy[i];
            nx = cur.x + dx[i];

            if(isInside(nz,ny,nx) && map[nz][ny][nx]==0 && mapCheck[nz][ny][nx]==0 ){
                mapCheck[nz][ny][nx] = 1;
                q.push({nz,ny,nx});
                path[nz][ny][nx] = path[cur.z][cur.y][cur.x] + 1;
            }
        }
    }
}
void InputData(){
    cin >> M >> N >> H;
    for( int z=0; z < H; z++){
        for( int y=0; y < N; y++){
            for( int x=0; x < M; x++){
                cin >> map[z][y][x];
                if( map[z][y][x] == 1 ){
                    q.push({z,y,x}); 
                 }
             }
        }
    }
}
int main(){
    InputData();
    Solve();

    for( int z=0; z <H; z++){
        for( int y=0; y < N; y++){
            for( int x=0; x < M; x++){
                if( map[z][y][x] == 0 && path[z][y][x] == 0 ){
                    cout << -1 << endl;	
                    return 0;
                }
            }
        }
    }

    int ans = -1;
    for( int z=0; z < H; z++){
        for( int y=0; y < N; y++){
            for( int x=0; x < M; x++){
                if( path[z][y][x] > ans ){
                    ans = path[z][y][x];	
                }
            }
        }
    }
    cout << ans << endl;

    return 0;
}
/*baekjoon 7569 토마토 BFS*/
반응형
반응형

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

출력

첫째 줄에 연결 요소의 개수를 출력한다.

 

예제 입력 1 
6 5
1 2
2 5
5 1
3 4
4 6
예제 출력 1 
2
예제 입력 2 
6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3
예제 출력 2 
1

 

/*[11724] baekjoon 연결 요소의 개수*/
#include <bits/stdc++.h>
using namespace std;
#define MAXN ((int) 1e3) 

int N,M,cnt=0;
int s[MAXN*MAXN], e[MAXN*MAXN];
int mat[MAXN+10][MAXN+10];
int visited[MAXN+10];

void InputData(){
	int u, v;
	cin >> N >> M;
	for (int i=0; i<M; i++){
		cin >> u >> v;
		mat[u][v] = 1;
		mat[v][u] = 1;
	}
}
void DFS(int x){
	visited[x] = 1;
	for(int i =1; i<=N; i++){
		if(mat[x][i] ==1 && visited[i] ==0){
			DFS(i);
		}
	}
}
void BFS(int x){
	int t;
	queue <int> q;
	q.push(x);
	visited[x] = 1;
	while( !q.empty()){
		t = q.front();
		q.pop();
		for(int i=1; i<=N; i++){
			if(mat[t][i] == 1 && visited[i] ==0){ 
				q.push(i);
				visited[i] =1;
			}
		}
	}
}
void Solve(){
	for(int i=1; i<=N; i++){
		if(visited[i] ==0){
			BFS(i);
			cnt++;
		}
	}
	cout << cnt << endl;
}
int main(){
	InputData();
	Solve();
	return 0;
}
/*[11724] baekjoon 연결 요소의 개수*/
반응형

+ Recent posts