반응형

[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
반응형

문제

시골에 있는 태양이의 삼촌 댁에는 커다란 참외밭이 있다. 문득 태양이는 이 밭에서 자라는 참외가 도대체 몇 개나 되는지 궁금해졌다. 어떻게 알아낼 수 있는지 골똘히 생각하다가 드디어 좋은 아이디어가 떠올랐다. 유레카! 1m^2의 넓이에 자라는 참외 개수를 헤아린 다음, 참외밭의 넓이를 구하면 비례식을 이용하여 참외의 총개수를 구할 수 있다.

1m^2의 넓이에 자라는 참외의 개수는 헤아렸고, 이제 참외밭의 넓이만 구하면 된다. 참외밭은 ㄱ-자 모양이거나 ㄱ-자를 90도, 180도, 270도 회전한 모양(┏, ┗, ┛ 모양)의 육각형이다. 다행히도 밭의 경계(육각형의 변)는 모두 동서 방향이거나 남북 방향이었다. 밭의 한 모퉁이에서 출발하여 밭의 둘레를 돌면서 밭경계 길이를 모두 측정하였다.

예를 들어 참외밭이 위 그림과 같은 모양이라고 하자. 그림에서 오른쪽은 동쪽, 왼쪽은 서쪽, 아래쪽은 남쪽, 위쪽은 북쪽이다. 이 그림의 왼쪽위 꼭짓점에서 출발하여, 반시계방향으로 남쪽으로 30m, 동쪽으로 60m, 남쪽으로 20m, 동쪽으로 100m, 북쪽으로 50m, 서쪽으로 160m 이동하면 다시 출발점으로 되돌아가게 된다.

위 그림의 참외밭  면적은 6800m^2이다. 만약 1m^2의 넓이에 자라는 참외의 개수가 7이라면, 이 밭에서 자라는 참외의 개수는 47600으로 계산된다.

1m^2의 넓이에 자라는 참외의 개수와, 참외밭을 이루는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이가 순서대로 주어진다. 이 참외밭에서 자라는 참외의 수를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 1m^2의 넓이에 자라는 참외의 개수를 나타내는 양의 정수 K (1≤K≤20)가 주어진다. 참외밭을 나타내는 육각형의 임의의 한 꼭짓점에서 출발하여 반시계방향으로 둘레를 돌면서 지나는 변의 방향과 길이 (1 이상 500 이하의 정수) 가 둘째 줄부터 일곱 번째 줄까지 한 줄에 하나씩 순서대로 주어진다. 변의 방향에서 동쪽은 1, 서쪽은 2, 남쪽은 3, 북쪽은 4로 나타낸다.

출력

첫째 줄에 입력으로 주어진 밭에서 자라는 참외의 수를 출력한다.

풀이 

-면적을 구하는 방법 생각 (백준 2166과 동일한 방식으로 풀면 되나 입력이 달라서 좌표로 변환하는 부분이 추가되어야 합니다.)

-SW에서는 아래 신발끈 공식을 이용해서 면적을 구해야 함.

https://ko.wikipedia.org/wiki/%EC%8B%A0%EB%B0%9C%EB%81%88_%EA%B3%B5%EC%8B%9D

 

신발끈 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 신발끈 공식(―公式)은 좌표평면 상에서 꼭짓점의 좌표를 알 때 다각형의 면적을 구할 수 있는 방법이다. 다각형의 각 꼭짓점의 좌푯값을 교차하여 곱하는 모

ko.wikipedia.org

/*baekjoon 2477 참외밭*/
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 10010

struct Coordinate{
	int d;
	int length;
};

struct ST{
	int x;
	int y;
};

int	N;
struct Coordinate C[MAX];
struct ST CD[MAX];

void InputData(){
	//input data size
	cin >> N;
	//input data
	for(int i = 0; i < 6; i++){
		cin >> C[i].d >> C[i].length;
	}
}

void OutputData(){
	for( int i=0; i<N; i++){
	printf("\n");
	}
}

void ChangeCoord(){
	CD[0].x = 0;
	CD[0].y = 0;

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

		if( C[i].d == 1){
			CD[i+1].x = CD[i].x - C[i].length;
			CD[i+1].y += CD[i].y;
		}else if( C[i].d ==2 ){
			CD[i+1].x = CD[i].x + C[i].length;
			CD[i+1].y += CD[i].y;
		}else if( C[i].d == 3){
			CD[i+1].x += CD[i].x;
			CD[i+1].y = CD[i].y - C[i].length;
		}else if( C[i].d == 4){
			CD[i+1].x += CD[i].x;
			CD[i+1].y = CD[i].y + C[i].length;
		}

	}

}

int Solve(){
	int Sum=0;
	ChangeCoord();	
	for(int i=0; i<6; i++){
		int idx;
		idx = (i+1) % 6;
		Sum += (CD[i].x * CD[idx].y - CD[idx].x * CD[i].y );
	}
	return abs(Sum)/2.0;
}

int main()
{
	int ans=0;
	cout.precision(1);
	cout << fixed;
	InputData();
	ans = Solve();	
	cout << ans*N << endl;
	return 0;
}
/*baekjoon 2477 참외밭*/

 

반응형

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

[c++][알고리즘]별찍기1~6  (0) 2021.10.11
[c++]baekjoon 2166 다각형의 면적  (0) 2021.06.05
반응형

문제

2차원 평면상에 N(3 ≤ N ≤ 10,000)개의 점으로 이루어진 다각형이 있다. 이 다각형의 면적을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. 다음 N개의 줄에는 다각형을 이루는 순서대로 N개의 점의 x, y좌표가 주어진다. 좌표값은 절댓값이 100,000을 넘지 않는 정수이다.

출력

첫째 줄에 면적을 출력한다. 면적을 출력할 때에는 소수점 아래 둘째 자리에서 반올림하여 첫째 자리까지 출력한다.

풀이 

-면적을 구하는 방법 생각 

-SW에서는 아래 신발끈 공식을 이용해서 면적을 구해야 함.

https://ko.wikipedia.org/wiki/%EC%8B%A0%EB%B0%9C%EB%81%88_%EA%B3%B5%EC%8B%9D

 

신발끈 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 신발끈 공식(―公式)은 좌표평면 상에서 꼭짓점의 좌표를 알 때 다각형의 면적을 구할 수 있는 방법이다. 다각형의 각 꼭짓점의 좌푯값을 교차하여 곱하는 모

ko.wikipedia.org

/*baekjoon 2166 다각형 면적 */
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 10010

struct ST{
	double x;
	double y;
};

int	N;
struct ST CD[MAX];

void InputData(){
	//input data size
	cin >> N;
	//input data
	for(int i = 0; i < N; i++){
		cin >> CD[i].x >> CD[i].y;
	}
}

void OutputData(){
	for( int i=0; i<N; i++){
	printf("\n");
	}
}

double Solve(){
	double Sum=0;
	
	for(int i=0; i<N; i++){
		int idx;
		idx = (i+1) % N;
		Sum += (CD[i].x * CD[idx].y - CD[idx].x * CD[i].y );
	}
	return abs(Sum)/2.0;
}

int main()
{
	double ans=0;
	cout.precision(1);
	cout << fixed;
	InputData();
	ans = Solve();	
	cout << ans << endl;
	return 0;
}
/*baekjoon 2166 다각형 면적 */

 

반응형

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

[c++][알고리즘]별찍기1~6  (0) 2021.10.11
[c++]baekjoon 2477 참외밭  (0) 2021.06.05

+ Recent posts