728x90
반응형
  • 문제

눈금의 간격이 1인 M×N(M,N≤100)크기의 모눈종이가 있다. 이 모눈종이 위에 눈금에 맞추어 K개의 직사각형을 그릴 때, 이들 K개의 직사각형의 내부를 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어진다.

예를 들어 M=5, N=7 인 모눈종이 위에 <그림 1>과 같이 직사각형 3개를 그렸다면, 그 나머지 영역은 <그림 2>와 같이 3개의 분리된 영역으로 나누어지게 된다.

<그림 2>와 같이 분리된 세 영역의 넓이는 각각 1, 7, 13이 된다.

M, N과 K 그리고 K개의 직사각형의 좌표가 주어질 때, K개의 직사각형 내부를 제외한 나머지 부분이 몇 개의 분리된 영역으로 나누어지는지, 그리고 분리된 각 영역의 넓이가 얼마인지를 구하여 이를 출력하는 프로그램을 작성하시오.

  • 입력

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오른쪽 위 꼭짓점의 x, y좌표값이 빈칸을 사이에 두고 차례로 주어진다. 모눈종이의 왼쪽 아래 꼭짓점의 좌표는 (0,0)이고, 오른쪽 위 꼭짓점의 좌표는(N,M)이다. 입력되는 K개의 직사각형들이 모눈종이 전체를 채우는 경우는 없다.

  • 출력

첫째 줄에 분리되어 나누어지는 영역의 개수를 출력한다. 둘째 줄에는 각 영역의 넓이를 오름차순으로 정렬하여 빈칸을 사이에 두고 출력한다.

  • 예제 입력
5 7 3
0 2 4 4
1 1 2 5
4 0 6 2
  • 예제 출력
3
1 7 13
  • 접근방식

색칠하지 않은 부분인 연결된 컴퍼넌트 (Connected Component)를 구하는 문제, DFS를 사용하는데 int형 dfs를 사용해봄

  • 코드
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>

using namespace std;

#define y1 snrkdlrjfTma // y1이라는 변수를 라이브러리에서 사용하기 때문에 따로 정의해야함

int n, m, k;
int x1, x2, y1, y2;

int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };

vector<int> ret;

int _map[104][104], visited[104][104];

int dfs(int y, int x) // void dfs로도 가능
{
	visited[y][x] = 1;
	int ret = 1;
	for (int i = 0; i < 4; i++)
	{
		int ny = y + dy[i];
		int nx = x + dx[i];

		if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] == 1)
			continue;
		if (_map[ny][nx] == 1)
			continue;
		ret += dfs(ny, nx);
	}
	return ret;
}

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

	for (int i = 0; i < k; i++)
	{
		cin >> x1 >> y1 >> x2 >> y2;
		for (int x = x1; x < x2; x++)
		{
			for (int y = y1; y < y2; y++)
			{
				_map[y][x] = 1; // 색칠하기
			}
		}
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (_map[i][j] == 0 && visited[i][j] == 0)
			{
				ret.push_back(dfs(i, j)); // 색칠하지 않은부분 dfs하고 사이즈 값을 vector에 넣어줌
			}
		}
	}

	sort(ret.begin(), ret.end());
	cout << ret.size() << "\n";
	for (auto a : ret)
		cout << a << " ";

	return 0;
}
 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 2828번 사과 담기 게임  (0) 2023.01.13
[C++]/백준 1992번 쿼드 트리  (0) 2023.01.13
[C++]/백준 2468번 안전 영역  (1) 2023.01.13
[C++]/백준 1012번 유기농 배추  (0) 2023.01.13
[C++]/백준 2178번 미로 탐색  (0) 2023.01.13
728x90
반응형
  • 문제

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는 안전한 영역이 최대로 몇 개가 만들어 지는 지를 조사하려고 한다. 이때, 문제를 간단하게 하기 위하여, 장마철에 내리는 비의 양에 따라 일정한 높이 이하의 모든 지점은 물에 잠긴다고 가정한다.

어떤 지역의 높이 정보는 행과 열의 크기가 각각 N인 2차원 배열 형태로 주어지며 배열의 각 원소는 해당 지점의 높이를 표시하는 자연수이다. 예를 들어, 다음은 N=5인 지역의 높이 정보이다.

6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7

이제 위와 같은 지역에 많은 비가 내려서 높이가 4 이하인 모든 지점이 물에 잠겼다고 하자. 이 경우에 물에 잠기는 지점을 회색으로 표시하면 다음과 같다. 

6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7

물에 잠기지 않는 안전한 영역이라 함은 물에 잠기지 않는 지점들이 위, 아래, 오른쪽 혹은 왼쪽으로 인접해 있으며 그 크기가 최대인 영역을 말한다. 위의 경우에서 물에 잠기지 않는 안전한 영역은 5개가 된다(꼭짓점으로만 붙어 있는 두 지점은 인접하지 않는다고 취급한다). 

또한 위와 같은 지역에서 높이가 6이하인 지점을 모두 잠기게 만드는 많은 비가 내리면 물에 잠기지 않는 안전한 영역은 아래 그림에서와 같이 네 개가 됨을 확인할 수 있다. 

6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7

이와 같이 장마철에 내리는 비의 양에 따라서 물에 잠기지 않는 안전한 영역의 개수는 다르게 된다. 위의 예와 같은 지역에서 내리는 비의 양에 따른 모든 경우를 다 조사해 보면 물에 잠기지 않는 안전한 영역의 개수 중에서 최대인 경우는 5임을 알 수 있다. 

어떤 지역의 높이 정보가 주어졌을 때, 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 계산하는 프로그램을 작성하시오. 

  • 입력

첫째 줄에는 어떤 지역을 나타내는 2차원 배열의 행과 열의 개수를 나타내는 수 N이 입력된다. N은 2 이상 100 이하의 정수이다. 둘째 줄부터 N개의 각 줄에는 2차원 배열의 첫 번째 행부터 N번째 행까지 순서대로 한 행씩 높이 정보가 입력된다. 각 줄에는 각 행의 첫 번째 열부터 N번째 열까지 N개의 높이 정보를 나타내는 자연수가 빈 칸을 사이에 두고 입력된다. 높이는 1이상 100 이하의 정수이다.

  • 출력

첫째 줄에 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 출력한다.

  • 예제 입력
5
6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7
7
9 9 9 9 9 9 9
9 2 1 2 1 2 9
9 1 8 7 8 1 9
9 2 7 9 7 2 9
9 1 8 7 8 1 9
9 2 1 2 1 2 9
9 9 9 9 9 9 9
  • 예제 출력
5
6
  • 접근방식

연결된 컴퍼넌트 (Connected Component)를 구하는 문제, 높이를 1~101까지 반복해서 구한후 그 중에서 최대값을 구함

  • 코드
#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

int n, ret = 0;

int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };

int _map[104][104], visited[104][104];

void dfs(int y, int x, int d)
{
	visited[y][x] = 1;

	for (int i = 0; i < 4; i++)
	{
		int ny = y + dy[i];
		int nx = x + dx[i];

		if (ny < 0 || ny >= n || nx < 0 || nx >= n)
			continue;
		if (_map[ny][nx] > d && !visited[ny][nx]) // 높이보다 크고 방문처리가 안되어 있는 곳만 구함(안전영역)
			dfs(ny, nx , d);
	}
}

int main() 
{
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> _map[i][j];
		}
	}

	for (int d = 1; d < 101; d++)
	{
		memset(visited, 0, sizeof(visited)); // 높이마다 방문기록을 초기화
		int cnt = 0;
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (_map[i][j] > d && !visited[i][j])
				{
					dfs(i, j, d);
					cnt++;
				}
			}
		}
		ret = max(ret, cnt); // 높이마다 나온 값중 최대값을 구함
	}

	cout << ret;

	return 0;
}
 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 1992번 쿼드 트리  (0) 2023.01.13
[C++]/백준 2583번 영역구하기  (0) 2023.01.13
[C++]/백준 1012번 유기농 배추  (0) 2023.01.13
[C++]/백준 2178번 미로 탐색  (0) 2023.01.13
[C++]/백준 4375번 1  (0) 2023.01.12
728x90
반응형
  • 문제

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. 한 배추의 상하좌우 네 방향에 다른 배추가 위치한 경우에 서로 인접해있는 것이다.

한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어 놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다. 예를 들어 배추밭이 아래와 같이 구성되어 있으면 최소 5마리의 배추흰지렁이가 필요하다. 0은 배추가 심어져 있지 않은 땅이고, 1은 배추가 심어져 있는 땅을 나타낸다.

1 1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 1 1 0 0 0 1 1 1
0 0 0 0 1 0 0 1 1 1
  • 입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 첫째 줄에는 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)이 주어진다. 그 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)가 주어진다. 두 배추의 위치가 같은 경우는 없다.

  • 출력

각 테스트 케이스에 대해 필요한 최소의 배추흰지렁이 마리 수를 출력한다.

  • 예제 입력
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
1
5 3 6
0 2
1 2
2 2
3 2
4 2
4 0
  • 예제 출력
5
1
2
  • 접근방식

연결된 Conneted Component의 갯수

연결된 conneted Component를 찾는 문제, BFS, DFS 모두 가능하지만 DFS로 해결

  • 코드
#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;

int n, m, k, t, cnt, x, y;

int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };

int _map[104][104], visited[104][104];

void dfs(int y, int x)
{
	visited[y][x] = 1;

	for (int i = 0; i < 4; i++)
	{
		int ny = y + dy[i];
		int nx = x + dx[i];

		if (ny < 0 || ny >= n || nx < 0 || nx >= m)
			continue;
		if (_map[ny][nx] == 1 && !visited[ny][nx]) // 다음 방문할 곳이 1이고 방문되어 있지 않으면 그곳을 탐색
			dfs(ny, nx);
	}
}

int main() 
{
	cin >> t;

	while (t--)
	{
		memset(_map, 0, sizeof(_map)); // 테스트마다 _map과 visited를 0으로 초기화해서 찾아야함
		memset(visited, 0, sizeof(visited));

		cnt = 0;

		cin >> m >> n >> k;

		for (int i = 0; i < k; i++) // k개 만큼 좌표에 배추 심기
		{
			cin >> x >> y;
			_map[y][x] = 1;
		}

		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < m; j++)
			{
				if (_map[i][j] == 1 && !visited[i][j])
				{
					dfs(i, j);
					cnt++;
				}

			}
		}
		cout << cnt << "\n";
	}


	return 0;
}
 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 2583번 영역구하기  (0) 2023.01.13
[C++]/백준 2468번 안전 영역  (1) 2023.01.13
[C++]/백준 2178번 미로 탐색  (0) 2023.01.13
[C++]/백준 4375번 1  (0) 2023.01.12
[C++]/백준 1629번 곱셈  (0) 2023.01.12
728x90
반응형
  • 문제

N×M크기의 배열로 표현되는 미로가 있다.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

미로에서 1은 이동할 수 있는 칸을 나타내고, 0은 이동할 수 없는 칸을 나타낸다. 이러한 미로가 주어졌을 때, (1, 1)에서 출발하여 (N, M)의 위치로 이동할 때 지나야 하는 최소의 칸 수를 구하는 프로그램을 작성하시오. 한 칸에서 다른 칸으로 이동할 때, 서로 인접한 칸으로만 이동할 수 있다.

위의 예에서는 15칸을 지나야 (N, M)의 위치로 이동할 수 있다. 칸을 셀 때에는 시작 위치와 도착 위치도 포함한다.

  • 입력

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

  • 출력

첫째 줄에 지나야 하는 최소의 칸 수를 출력한다. 항상 도착위치로 이동할 수 있는 경우만 입력으로 주어진다.

  • 예제 입력
4 6
101111
101010
101011
111011
4 6
110110
110110
111111
111101
2 25
1011101110111011101110111
1110111011101110111011101
7 7
1011111
1110001
1000001
1000001
1000001
1000001
1111111
  • 예제 출력
15
9
38
13
  • 접근방식

붙어서 입력받는 경우 scanf 를 사용, 최단 거리는 BFS 사용

  • 코드
#include <iostream>
#include <algorithm>
#include <queue>
#include <tuple>

using namespace std;

int n, m;

int dy[4] = { -1,0,1,0 };
int dx[4] = { 0,1,0,-1 };

int _map[104][104], visited[104][104];

void bfs(int y, int x)
{
	queue<pair<int, int>> q;
	visited[y][x] = 1;
	q.push({ y,x });

	while (q.size())
	{
		tie(y, x) = q.front();
		q.pop();

		for (int i = 0; i < 4; i++)
		{
			int ny = y + dy[i];
			int nx = x + dx[i];

			if (ny < 0 || ny >= n || nx < 0 || nx >= m || visited[ny][nx] || _map[ny][nx] == 0)
				continue;

			visited[ny][nx] = visited[y][x] + 1;
			q.push({ ny,nx });
		}
	}
}

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

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			scanf_s("%1d", &_map[i][j]); // 붙어서 입력받을때는 string으로 입력받거나 scanf로 입력받기
			//string s;
			//cin >> s;
			//for (int j = 0; j < m; j++)
			//{
			//	_map[i][j] = s[j] - '0';
			//}
		}
	}

	bfs(0, 0);

	cout << visited[n - 1][m - 1]; // 최단 거리 출력
	return 0;
}
 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 2468번 안전 영역  (1) 2023.01.13
[C++]/백준 1012번 유기농 배추  (0) 2023.01.13
[C++]/백준 4375번 1  (0) 2023.01.12
[C++]/백준 1629번 곱셈  (0) 2023.01.12
[C++]/백준 3986번 좋은 단어  (0) 2023.01.12
728x90
반응형
  • 문제

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

  • 입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.

  • 출력

1로 이루어진 n의 배수 중 가장 작은 수의 자리수를 출력한다.

  • 예제 입력
3
7
9901
  • 예제 출력
3
6
12
  • 접근방식

1, 11, 111 ...을 % n == 0 이면 배수임 → 1의 개수를 카운팅 → 수가 너무 크면 오버 플로우 발생

따라서 모듈러 산술 연산을 이용해야함

모듈러 산술 연산은 분배 법칙이 성립함

11 = 10 +1 이고 111 = 100 + 10 + 1 ... 이런식으로 나아간다

  • 코드
#include <iostream>
#include <algorithm>

using namespace std;

int n;

int main() 
{
	while (cin >> n)
	{
		int cnt = 1, ret = 1; // ret은 1의 갯수

		while (1)
		{
			if (cnt % n == 0) // cnt가 n의 배수이면 종료
			{
				cout << ret << "\n";
				break;
			}
			else
			{
				cnt = (cnt * 10) + 1; // (cnt *10) + 1 을 반복하면 111 = 100+10+1 처럼 만들수 있음
				cnt %= n; // 모듈러 연산으로 오버플로우 방지
				ret++;
			}
		}
	}

	return 0;
}
 

4375번: 1

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 1012번 유기농 배추  (0) 2023.01.13
[C++]/백준 2178번 미로 탐색  (0) 2023.01.13
[C++]/백준 1629번 곱셈  (0) 2023.01.12
[C++]/백준 3986번 좋은 단어  (0) 2023.01.12
[C++]/백준 1940 주몽  (0) 2023.01.12
728x90
반응형
  • 문제

자연수 A를 B번 곱한 수를 알고 싶다. 단 구하려는 수가 매우 커질 수 있으므로 이를 C로 나눈 나머지를 구하는 프로그램을 작성하시오.

  • 입력

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

  • 출력

첫째 줄에 A를 B번 곱한 수를 C로 나눈 나머지를 출력한다.

  • 예제 입력
10 11 12
  • 예제 출력
4
  • 접근방식

쉬워 보이지만 수가 매우 커지면 오버 플로우 발생, 모듈러 연산으로 처리해야함

값이 너무 커지면 함수로 나눠서 풀어야함
모듈러 산술 연산은 분배 법칙이 성립함

  • 코드

 

#include <iostream>
#include <algorithm>

using namespace std;

long long a, b, c;

long long modular(long long a, long long b) // 나눠서 푸는 방법
{
	if (b == 1) // 기저 사례 a^1이 되면 그냥 반환
		return a % c;

	long long ret = modular(a, b / 2); // 반으로 나눔
	ret = (ret * ret) % c; // 모듈러 연산으로 계속 나눔

	if (b % 2)
		ret = (ret * a) % c; // 홀수면 한번 더 2^5 = 2^2 * 2^2 * 2^1

	return ret;
}

int main() 
{
	cin >> a >> b >> c;

	cout << modular(a, b);

	return 0;
}

 

 

1629번: 곱셈

첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다.

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 2178번 미로 탐색  (0) 2023.01.13
[C++]/백준 4375번 1  (0) 2023.01.12
[C++]/백준 3986번 좋은 단어  (0) 2023.01.12
[C++]/백준 1940 주몽  (0) 2023.01.12
[C++]/백준 1213번 팰린드롬 만들기  (0) 2023.01.12
728x90
반응형
  • 문제

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에 깨고 말았다. 안타깝게도 자는 동안 키보드가 잘못 눌려서 보고서의 모든 글자가 A와 B로 바뀌어 버렸다! 그래서 평석이는 보고서 작성을 때려치우고 보고서에서 '좋은 단어'나 세보기로 마음 먹었다.

평석이는 단어 위로 아치형 곡선을 그어 같은 글자끼리(A는 A끼리, B는 B끼리) 쌍을 짓기로 하였다. 만약 선끼리 교차하지 않으면서 각 글자를 정확히 한 개의 다른 위치에 있는 같은 글자와 짝 지을수 있다면, 그 단어는 '좋은 단어'이다. 평석이가 '좋은 단어' 개수를 세는 것을 도와주자.

  • 입력

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

다음 N개 줄에는 A와 B로만 이루어진 단어가 한 줄에 하나씩 주어진다. 단어의 길이는 2와 100,000사이이며, 모든 단어 길이의 합은 1,000,000을 넘지 않는다.

  • 출력

첫째 줄에 좋은 단어의 수를 출력한다.

  • 예제 입력
3
ABAB
AABB
ABBA
3
AAA
AA
AB
1
ABBABB
  • 예제 출력
2
1
1
  • 접근방식

문자열을 뒤집어보고 세로로 놓아보고 더 붙여보거나 등 여러가지 시도를 해보기
짝짓기, 폭발 등은 스택을 이용하는게 좋음

문자열을 입력 받을때마다 스택 초기화, 문자열을 스택에 차례대로 넣는데 top이 들어올려는 문자면 pop, 스택의 사이즈가 0이면 좋은 단어

  • 코드
#include <iostream>
#include <algorithm>
#include <string>
#include <stack>

using namespace std;

int n, ret = 0;
string s;

int main() 
{
	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> s;

		stack<char> stk; // 문자열을 입력받을때마다 스택 초기화

		for (char a : s)
		{
			if (stk.size() && stk.top() == a) // 스택이 존재하고 맨 위가 같은 문자면 pop
				stk.pop();
			else
				stk.push(a);
		}

		if (stk.size() == 0)
			ret++;
	}

	cout << ret;

	return 0;
}
 

3986번: 좋은 단어

이번 계절학기에 심리학 개론을 수강 중인 평석이는 오늘 자정까지 보고서를 제출해야 한다. 보고서 작성이 너무 지루했던 평석이는 노트북에 엎드려서 꾸벅꾸벅 졸다가 제출 마감 1시간 전에

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 4375번 1  (0) 2023.01.12
[C++]/백준 1629번 곱셈  (0) 2023.01.12
[C++]/백준 1940 주몽  (0) 2023.01.12
[C++]/백준 1213번 팰린드롬 만들기  (0) 2023.01.12
[C++]/백준 9375번 패션왕 신해빈  (0) 2023.01.12
728x90
반응형
  • 문제

주몽은 철기군을 양성하기 위한 프로젝트에 나섰다. 그래서 야철대장을 통해 철기군이 입을 갑옷을 만들게 하였다. 야철대장은 주몽의 명에 따르기 위하여 연구에 착수하던 중 아래와 같은 사실을 발견하게 되었다.

갑옷을 만드는 재료들은 각각 고유한 번호를 가지고 있다. 갑옷은 두 개의 재료로 만드는데 두 재료의 고유한 번호를 합쳐서 M(1 ≤ M ≤ 10,000,000)이 되면 갑옷이 만들어 지게 된다. 야철대장은 자신이 만들고 있는 재료를 가지고 갑옷을 몇 개나 만들 수 있는지 궁금해졌다. 이러한 궁금증을 풀어 주기 위하여 N(1 ≤ N ≤ 15,000) 개의 재료와 M이 주어졌을 때 몇 개의 갑옷을 만들 수 있는지를 구하는 프로그램을 작성하시오.

  • 입력

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고유한 번호들이 공백을 사이에 두고 주어진다. 고유한 번호는 100,000보다 작거나 같은 자연수이다.

  • 출력

첫째 줄에 갑옷을 만들 수 있는 개수를 출력한다.

  • 예제 입력
6
9
2 7 4 1 5 3
  • 예제 출력
2
  • 접근방식

순서와 상관없이 2개를 뽑아서 합이 m이면 카운팅

  • 코드
#include <iostream>
#include <algorithm>

using namespace std;

int n, m, a[150001], cnt;

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

	for (int i = 0; i < n; i++)
		cin >> a[i];

	if (m > 200000) // 고유한 번호가 20만을 넘어가면 안됨 ( 10만 + 10만 )
		cout << 0;
	else
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = i + 1; j < n; j++) // 중첩 for문 x번을 사용해 x개를 뽑음
			{
				if (a[i] + a[j] == m)
					cnt++;
			}
		}
		cout << cnt;
	}
	return 0;
}
 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net

 

728x90
반응형

+ Recent posts