반응형
DoZZang
Do IT
DoZZang
전체 방문자
오늘
어제
  • Programming
    • Git
    • Web
    • 기타
    • Python
      • CodeUp
    • Math
    • Algorithm
    • Baekjoon
    • C,C++
    • Life
      • 독서
      • Just
      • 영화

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DoZZang

Do IT

[C++] 7569번: 토마토
C,C++

[C++] 7569번: 토마토

2024. 3. 21. 21:15
반응형

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 라이브러리에 저장되어 있다.)

https://modoocode.com/309

 

씹어먹는 C++ - <17 - 5. C++ 17 의 std::optional, variant, tuple 살펴보기>

optional 을 통해 원하는 데이터를 가지거나 가지지 않는 객체를 만들 수 있습니다. variant 를 통해 여러 타입 들 중 하나 를 나타내는 객체를 만들 수 있습니다. tuple 을 통해 여러 서로다른 타입들

modoocode.com

- tuple은 같은 type 혹은 다른 type으로 구성되는 것을 모두 허용한다

- 값에 접근하기 위해 std::get<index>(tuplename)으로 접근할 수 있다. 아마 pair은 정확히 2개의 인자가 들어가기 때문인 것 같다.

https://modoocode.com/299

 

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
    'C,C++' 카테고리의 다른 글
    • 많은 수의 전역변수를 선언하면 안될까?
    • 공용체(union),리틀 엔디안(Little Endian)과 빅 엔디안(Big Endian)
    DoZZang
    DoZZang
    과정은 힘들지만 성장은 즐겁습니다.

    티스토리툴바