리뷰
https://www.acmicpc.net/problem/12886
문제를 잘못 읽어 접근이 이상했는데 돌의 개수를 두개만 비교해도 된다는 접근을 하게 되었다.
전역 변수
- a, b, c : 세개의 돌의 크기를 저장할 변수
- total : 세 돌의 크기의 합을 저장할 변수
- v : 방문 정보를 체크하기 위한 변수
- S : 두 돌의 크기를 정의할 구조체
함수
1. bfs
bool bfs()
너비 우선 탐색을 통해 세 돌의 크기가 같아질 수 있는지 체크하기 위한 함수
- S타입의 큐 q를 초기화 하고, 세 돌 중 아무 돌이나 두개를 묶어 push해준다.
- 두 돌의 현재 크기를 기준으로 v배열에 방문 처리를 진행해 준다.
- q가 빌 때 까지 while 루프를 순회하고, 매 루프마다 요소를 한개씩 꺼내어 준다.
- 두 돌을 각각 변수 a, b로 저장하고, 변수 c에는 total에서 두 돌의 크기를 뺀 값을 저장해 준다.
- 기저 조건으로 만약 a, b, c가 모두 동일하다면 true를 반환해 준다.
- 이후 a, b, c를 각각 비교하며 문제 조건에 맞는 연산 후 방문 처리 되어있지 않다면 방문처리 후 q에 추가해 준다.
- while 루프가 종료될 때 까지 기저 조건에 도달하지 못한다면 false를 반환해 준다.
문제풀이
- a, b, c 값을 입력 받고, 변수 total에 a, b, c의 합을 저장해 준다.
- bfs함수를 호출하여 받은 리턴값을 출력해 준다.
트러블 슈팅
- 매 루프 마다 최소 및 최대 크기의 돌만 연산해 주는 줄 알았으나, 크기가 다르다면 모두 진행해 주면 되었다.
- 구조체에 a, b, c 모두 관리하며 v를 3차원 배열로 관리하려 했으나 돌의 범위가 제한되었다.
- 두 돌의 크기만 알면 나머지 한 돌의 크기는 알기 때문에 v배열을 2차원으로 접근하니 메모리 문제가 해결되었다.
- v배열의 크기를 1001 * 1001로 설정해 주고 제출하였으나 OutOfBounds 에러가 출력되었다.
- 한 돌의 크기가 최대 1500까지 될 수 있으므로 v배열의 크기를 1501 * 1501로 설정해 주니 AC를 받았다.
참고 사항
- 크기가 같지 않은 두 그룹을 고른다. 그 다음, 돌의 개수가 작은 쪽을 X, 큰 쪽을 Y라고 정한다. 그 다음, X에 있는 돌의 개수를 X+X개로, Y에 있는 돌의 개수를 Y-X개로 만든다.
정답 코드
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int a, b, c, total;
bool v[1501][1501];
struct S {
int a, b;
};
bool bfs() {
queue<S> q;
q.push({ a, b });
v[a][b] = true;
while (!q.empty()) {
S s = q.front(); q.pop();
int a = s.a, b = s.b, c = total - s.a - s.b;
if (a == b && b == c) return true;
int abc[3] = { a, b, c };
for (int i = 0; i < 2; ++i) {
int n1 = abc[i];
for (int j = i + 1; j < 3; ++j) {
int n2 = abc[j];
if (n1 != n2) {
if (n1 > n2) swap(n1, n2);
n2 -= n1;
n1 *= 2;
//cout << n1 << " " << n2 << " " << total - n1 - n2 << "\n";
if (v[n1][n2]) continue;
v[n1][n2] = true;
q.push({ n1, n2 });
}
}
}
}
return false;
}
int main() {
cin >> a >> b >> c;
total = a + b + c;
cout << bfs();
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G2] 백준 1445번 일요일 아침의 데이트 C++ 다익스트라 (0) | 2025.03.07 |
---|---|
[G4] 백준 24955번 숫자 이어 붙이기 C++ 너비 우선 탐색 (0) | 2025.03.06 |
[G4] 백준 31792한빛미디어 (Hard) C++ 트리 셋, 이분 탐색 (0) | 2025.03.04 |
[G5] 백준 1374번 강의실 C++ 그리디 알고리즘, 정렬, 우선순위 큐 (0) | 2025.03.03 |
[G1] 백준 2098번 외판원 순회 C++ 비트마스킹, 다이나믹 프로그래밍 (0) | 2025.03.02 |