https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
풀이
7576번도 토마토였는데 또 토마토다!
실제로 idea도 7576번의 토마토를 그대로 따른다. 차이는 오로지 2차원이냐 3차원이냐다.
여기서 또 다른 utility인 tuple을 사용할 수 있다. 2차원 -> pair / 3차원 이상 -> tuple
(pair과 utility는 STL 같지만 utility 라이브러리에 저장되어 있다.)
씹어먹는 C++ - <17 - 5. C++ 17 의 std::optional, variant, tuple 살펴보기>
optional 을 통해 원하는 데이터를 가지거나 가지지 않는 객체를 만들 수 있습니다. variant 를 통해 여러 타입 들 중 하나 를 나타내는 객체를 만들 수 있습니다. tuple 을 통해 여러 서로다른 타입들
modoocode.com
- tuple은 같은 type 혹은 다른 type으로 구성되는 것을 모두 허용한다
- 값에 접근하기 위해 std::get<index>(tuplename)으로 접근할 수 있다. 아마 pair은 정확히 2개의 인자가 들어가기 때문인 것 같다.
C++ 레퍼런스 - utility 라이브러리
모두의 코드 C++ 레퍼런스 - utility 라이브러리 작성일 : 2019-09-20 이 글은 9632 번 읽혔습니다. C++ 의 라이브러리에는 여러가지 유용한 함수와 클래스들을 제공하고 있습니다. (사실 따로 라이브러리
modoocode.com
내 코드
#include <bits/stdc++.h>
using namespace std;
#define X get<0>
#define Y get<1>
#define Z get<2>
int board[100][100][100];
int dis[100][100][100];
int dx[6] = { 1,0,-1,0,0,0 };
int dy[6] = { 0,1,0,-1,0,0 };
int dz[6] = { 0,0,0,0,1,-1 };
int main() {
int M, N, H,day = 0;
cin >> M >> N >> H;
queue<tuple<int, int,int>> q;
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> board[k][i][j];
if (board[k][i][j] == 1) {
q.push({ k,i,j });
dis[k][i][j] = 1;
}
}
}
}
while (!q.empty()) {
tuple<int,int,int> cur = q.front(); q.pop();
for (int dir = 0; dir < 6; dir++) {
int x = X(cur) + dx[dir];
int y = Y(cur) + dy[dir];
int z = Z(cur) + dz[dir];
if (x < 0 || y < 0 || z < 0 || x >= H || y >= N || z >= M) continue;
if (dis[x][y][z] || board[x][y][z] == -1) continue;
q.push({ x,y,z });
board[x][y][z] = 1;
dis[x][y][z] = dis[X(cur)][Y(cur)][Z(cur)] + 1;
}
}
for (int k = 0; k < H; ++k) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (board[k][i][j] == 0) {
cout << -1;
return 0;
}
day = max(day, dis[k][i][j]);
}
}
}
cout << day - 1;
}
'C,C++' 카테고리의 다른 글
많은 수의 전역변수를 선언하면 안될까? (0) | 2022.09.07 |
---|---|
공용체(union),리틀 엔디안(Little Endian)과 빅 엔디안(Big Endian) (0) | 2022.09.06 |