https://www.acmicpc.net/problem/7568

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

문제

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼 때 C와 D는 누구도 상대방보다 더 크다고 말할 수 없다.

N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다. 이렇게 등수를 결정하면 같은 덩치 등수를 가진 사람은 여러 명도 가능하다. 아래는 5명으로 이루어진 집단에서 각 사람의 덩치와 그 등수가 표시된 표이다.

이름(몸무게, 키)덩치 등수
A (55, 185) 2
B (58, 183) 2
C (88, 186) 1
D (60, 175) 2
E (46, 155) 5

위 표에서 C보다 더 큰 덩치의 사람이 없으므로 C는 1등이 된다. 그리고 A, B, D 각각의 덩치보다 큰 사람은 C뿐이므로 이들은 모두 2등이 된다. 그리고 E보다 큰 덩치는 A, B, C, D 이렇게 4명이므로 E의 덩치는 5등이 된다. 위 경우에 3등과 4등은 존재하지 않는다. 여러분은 학생 N명의 몸무게와 키가 담긴 입력을 읽어서 각 사람의 덩치 등수를 계산하여 출력해야 한다.

입력

첫 줄에는 전체 사람의 수 N이 주어진다. 그리고 이어지는 N개의 줄에는 각 사람의 몸무게와 키를 나타내는 양의 정수 x와 y가 하나의 공백을 두고 각각 나타난다.

출력

여러분은 입력에 나열된 사람의 덩치 등수를 구해서 그 순서대로 첫 줄에 출력해야 한다. 단, 각 덩치 등수는 공백문자로 분리되어야 한다.

제한

  • 2 ≤ N ≤ 50
  • 10 ≤ x, y ≤ 200

예제 입력 1 복사

5
55 185
58 183
88 186
60 175
46 155

예제 출력 1 복사

2 2 1 2 5

풀이

  • 몸무게와 키를 페어로 만들어 벡터에 넣고 두 값이 모두 작을 경우에만 순위를 증가시켜 출력한다.

코드

#include <iostream>
#include <vector>

using namespace std;

int N, weight, height;
vector<pair<int, int>> v;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> weight >> height;
		v.push_back({ weight, height });
	}

	for (int i = 0; i < N; i++)
	{
		int rank = 1;
		for (int j = 0; j < N; j++)
		{
        	// 몸무게와 키가 모두 작을 경우에만 순위 증가시킨다.
			if (v[i].first < v[j].first && v[i].second < v[j].second)
			{
				rank++;
			}
		}
		cout << rank << " ";
	}

	return 0;
}

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

[C++] 백준 2231 - 분해합  (0) 2022.12.16
[C++] 백준 1018 - 체스판 다시 칠하기  (0) 2022.12.16
[C++] 백준 2798 - 블랙잭  (1) 2022.12.12

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

문제

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 된다. 따라서 245는 256의 생성자가 된다. 물론, 어떤 자연수의 경우에는 생성자가 없을 수도 있다. 반대로, 생성자가 여러 개인 자연수도 있을 수 있다.

자연수 N이 주어졌을 때, N의 가장 작은 생성자를 구해내는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력

첫째 줄에 답을 출력한다. 생성자가 없는 경우에는 0을 출력한다.

예제 입력 1 복사

216

예제 출력 1 복사

198

 


풀이

  • sum: 수와 자리 수를 더할 변수, temp: 자리수를 구할 변수
  • N의 분해합이 될 수 있는 수를 for문을 이용하여 1부터 N까지 모두 검사 -> 브루트 포스
  • 현재 인덱스를 sum과 temp 변수에 저장하고 인덱스를 10으로 나눈 나머지 값을 더한 뒤, 10으로 나누었다. -> 모든 자리수를 더하기 위해 % 연산자를 이용하여 1의 자리 수를 구하고, 10으로 나눠 1의 자리 제거
  • temp를 10으로 나누었을 때 0보다 클 경우(모든 자리수를 다 더하지 않았을 때) 위의 과정을 반복한다.
  • 검사 도중 어떤 수가 N과 같으면 for문을 벗어난다.

 

  • ex) 인덱스 i가 198일 경우 

1. temp: 198, sum: 198

- temp를 10으로 나눈 나머지를 sum 변수에 더한다. -------> temp: 198 % 10 = 8 ======>  sum:198 + 8 = 206

- temp를 10으로 나눈다. --------> temp / 10 = 198 / 10 = 19

 

2. temp: 19, sum: 206

- sum: 206 + (19 % 10) = 206 + 9 = 215, temp: 19 / 10 = 1

 

3. temp: 1, sum 215

- sum: 215 + (1 % 10) = 215 + 1 = 216, temp: 1 / 10 = 0

 

4. temp가 0이 되어 while문 벗어남. sum이 입력한 값의 분해합이라면 반복문 빠져나오고 아니면 인덱스 증가하여 계속 검사한다.

 

코드

#include <iostream>

using namespace std;

int N;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin >> N;

	for (int i = 1; i < N; i++)
	{
		int temp = i;
		int sum = i;

		while (temp > 0)
		{
			sum += temp % 10;
			temp /= 10;
		}

		if (sum == N)
		{
			cout << i;
			return 0;
		}
	}
	cout << 0;
	return 0;
}

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

[C++] 백준 7568 - 덩치  (1) 2022.12.16
[C++] 백준 1018 - 체스판 다시 칠하기  (0) 2022.12.16
[C++] 백준 2798 - 블랙잭  (1) 2022.12.12

https://www.acmicpc.net/problem/1018

 

1018번: 체스판 다시 칠하기

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

www.acmicpc.net

 
문제

지민이는 자신의 저택에서 MN개의 단위 정사각형으로 나누어져 있는 M×N 크기의 보드를 찾았다. 어떤 정사각형은 검은색으로 칠해져 있고, 나머지는 흰색으로 칠해져 있다. 지민이는 이 보드를 잘라서 8×8 크기의 체스판으로 만들려고 한다.

체스판은 검은색과 흰색이 번갈아서 칠해져 있어야 한다. 구체적으로, 각 칸이 검은색과 흰색 중 하나로 색칠되어 있고, 변을 공유하는 두 개의 사각형은 다른 색으로 칠해져 있어야 한다. 따라서 이 정의를 따르면 체스판을 색칠하는 경우는 두 가지뿐이다. 하나는 맨 왼쪽 위 칸이 흰색인 경우, 하나는 검은색인 경우이다.

보드가 체스판처럼 칠해져 있다는 보장이 없어서, 지민이는 8×8 크기의 체스판으로 잘라낸 후에 몇 개의 정사각형을 다시 칠해야겠다고 생각했다. 당연히 8*8 크기는 아무데서나 골라도 된다. 지민이가 다시 칠해야 하는 정사각형의 최소 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다.

출력

첫째 줄에 지민이가 다시 칠해야 하는 정사각형 개수의 최솟값을 출력한다.

예제 입력 1 복사

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

예제 출력 1 복사

1

예제 입력 2 복사

10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB

예제 출력 2 복사

12

예제 입력 3 복사

8 8
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB

예제 출력 3 복사

0

예제 입력 4 복사

9 23
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBW

예제 출력 4 복사

31

예제 입력 5 복사

10 10
BBBBBBBBBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBWBWBWBWB
BWBWBWBWBB
BBBBBBBBBB

예제 출력 5 복사

0

예제 입력 6 복사

8 8
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBBBWBW
WBWBWBWB
BWBWBWBW
WBWBWWWB
BWBWBWBW

예제 출력 6 복사

2

예제 입력 7 복사

11 12
BWWBWWBWWBWW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW
BWWBWBWWWBWW
WBWWBWBBWWBW
BWWBWBBWWBWW
WBWWBWBBWWBW

예제 출력 7 복사

15

풀이

  • 검정색과 하얀색 두 가지 경우 밖에 없기 때문에 'B'일 경우 0, 'W'일 경우 1로 0과 1로 변경하여 2차원 배열을 입력받는다.
  • 맨 위쪽 칸의 색에 따라 색칠해야 하는 횟수가 바뀌기 때문에 두 경우 모두를 확인해야 한다.
  • 첫 번째 칸이 흰색일 경우 해당 위치의 인덱스(x, y)를 더한 값이 모두 짝수가 되고, 첫 번째 칸이 검은색일 경우 인덱스 를 더한 값이 홀수가 된다.

  • 만약 흰색이 들어갈 자리에 검정색이 들어가 있을 경우 횟수를 증가시키고 벡터에 값을 저장하고 가장 작은 수를 구해 출력하였다.
void CheckBoard(int n, int m)
{
	int _firstCount = 0;
	int _secondCount = 0;

	for (int i = n; i < n + 8; i++)
	{
		for (int j = m; j < m + 8; j++)
		{
			// 흰색 타일로 시작할 때
			if ((i + j) % 2 == board[i][j])
			{
				_firstCount++;
			}
			// 검정 타일로 시작할 때
			if ((i + j + 1) % 2 == board[i][j])
			{
				_secondCount++;
			}
		}
	}

	v.push_back(_firstCount);
	v.push_back(_secondCount);
}

코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX 51

int N, M;   // 세로, 가로
int board[MAX][MAX];
vector<int> v;

// 흰색 자리에 검은색이 존재할 경우 색칠해야하는 횟수를 증가
// 체스판이 검은색으로 시작했을 때 or 흰색으로 시작했을 때 색칠해야하는 수를 구하여 벡터에 저장
void CheckBoard(int n, int m)
{
	int _firstCount = 0;
	int _secondCount = 0;

	for (int i = n; i < n + 8; i++)
	{
		for (int j = m; j < m + 8; j++)
		{
			// 흰색 타일로 시작할 때
			if ((i + j) % 2 == board[i][j])
			{
				_firstCount++;
			}
			// 검정 타일로 시작할 때
			if ((i + j + 1) % 2 == board[i][j])
			{
				_secondCount++;
			}
		}
	}

	v.push_back(_firstCount);
	v.push_back(_secondCount);
}


int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	// 세로 가로 입력
	cin >> N >> M;

	for (int i = 0; i < N; i++)
	{
		string str;
		cin >> str;
		for (int j = 0; j < M; j++)
		{
			// 검은색: 0, 하얀색 1로 변경하여 체스판 입력 받음
			if (str[j] == 'B')
				str[j] = 0;
			else
				str[j] = 1;
			board[i][j] = str[j];
		}
	}

	// 8*8 사이즈로 잘라 체스판 탐색
	for (int i = 0; i < N-7; i++)
	{
		for (int j = 0; j < M-7; j++)
		{
			CheckBoard(i, j);
		}
	}

	// 벡터에 담긴 수 중 가장 작은 값 반환하여 출력하기
	int answer = *min_element(v.begin(), v.end());
	cout << answer;

	return 0;
}

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

[C++] 백준 7568 - 덩치  (1) 2022.12.16
[C++] 백준 2231 - 분해합  (0) 2022.12.16
[C++] 백준 2798 - 블랙잭  (1) 2022.12.12

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

문제

카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.

한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.

김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다.

이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

예제 입력 1 복사

5 21
5 6 7 8 9

예제 출력 1 복사

21

예제 입력 2 복사

10 500
93 181 245 214 315 36 185 138 216 295

예제 출력 2 복사

497

풀이

  • 두번째 줄에 주어진 숫자 중 3개를 더한 값이 M(딜러가 외친 숫자)과 같거나 가까운 값(but, M을 초과해서는 안 됨)을 출력해야 하는 문제이다.
  • 주어진 숫자를 배열에 저장하고, 3중 for문 이용하여 배열에 저장되어 있는 수 중 3개를 더한 값을 sum 변수에 저장한다. 이 중 M과 같거나 작을 경우,  max 함수를 사용해 가장 큰 값을 반환한다. (제일 큰 수는 M과 같은 수)

 

코드

#include <iostream>

using namespace std;

#define MAX 101

int N, M;
int sum;
int result = 0;

int blackJack[MAX];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);

	// 카드의 개수와 딜러가 외친 숫자 입력 받기
	cin >> N >> M;

	for (int i = 0; i < N; i++)
	{
		cin >> blackJack[i];
	}

	for (int i = 0; i < N; i++)
	{
		for (int j = i + 1; j < N; j++)
		{
			for (int k = j + 1; k < N; k++)
			{
				sum = blackJack[i] + blackJack[j] + blackJack[k];
				if (sum <= M)
				{
					result = max(result, sum);	// 둘 중 큰 값을 반환
				}
			}

		}
	}

	cout << result;
	return 0;
}

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

[C++] 백준 7568 - 덩치  (1) 2022.12.16
[C++] 백준 2231 - 분해합  (0) 2022.12.16
[C++] 백준 1018 - 체스판 다시 칠하기  (0) 2022.12.16

+ Recent posts