celina의 이것저것
[C++] 백준 9455번 - 박스 본문
반응형
문제
m행 n열로 이루어진 그리드가 주어진다. 일부 칸에는 박스가 들어 있다. 모든 박스가 더 이상 움직일 수 없을 때 까지 아래로 움직인다면, 박스는 쌓여진 상태가 된다.
그림 (a)의 그리드의 크기는 5행 4열이고, 7칸에는 박스가 들어있다. 모든 박스가 계속해서 아래로 움직이면, 그림 (b)와 같이 변하게 된다.
박스가 움직인 거리는 바닥에 쌓이기 전 까지 이동한 칸의 개수이다. 예를 들어, 맨 왼쪽 열에서 가장 위에 있는 박스가 움직인 거리는 2이다. 모든 박스가 이동한 거리 (각 박스가 이동한 거리의 합) 을 구하는 프로그램을 작성하시오. 위의 예제에서 박스 7개가 움직인 거리는 8이다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 m과 n이 주어진다. (1 ≤ m, n ≤ 100) 다음 m개 줄에는 그리드의 각 행의 정보를 나타내는 n개의 정수가 주어진다. 그리드 첫 행부터 마지막 행까지 순서대로 주어진다. 박스가 들어있는 칸은 1로, 다른 칸은 0으로 주어진다. 각 정수 사이에는 공백이 하나 주어진다.
출력
각 테스트 케이스마다 입력으로 주어진 그리드에서 모든 박스가 이동한 거리를 출력한다
코드
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <math.h>
#include <cmath>
#include <cstring>
using namespace std;
#define all(x) (x).begin(), (x).end()
int main() {
int map[100][100];
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int m, n;
cin >> m >> n;
for (int j = 0; j < m; j++) {
for (int k = 0; k < n; k++) {
cin >> map[j][k];
}
} //그리드에 박스 입력받음
int ans = 0;
for (int i = 0; i < n; i++) {
int floor = m - 1; //바닥
int dump = 0;
for (int j = m - 1; j >= 0; j--) {
if (map[j][i] == 1) {
ans += floor - j-dump;
dump++;
}
}
}
cout << ans << endl;
}
return 0;
}
리뷰
일단 이차원 배열을 만들어서 입력을 받는다 (여기까진 걍 쉬움)
그리고 이제 여기서부터가 찐 생각을 해야하는데...
일단 맨 밑에서부터 거슬러 올라가야겠다고 생각했다 왜냐하면 박스를 밑으로 내려줘야하기 때문에
그래서 맨왼쪽밑부터 거슬러 올라가는 for문을 작성했다
와 그리고 if문 짜다가 레알 다 던지고 싶었다 진심으로.
우선 floor변수를 하나 만들었다 이건 바닥을 나타낸다 인덱스가 0부터 시작이라 하나 빼준거임 걍
그리고 dump라는 변수는 쌓인 박스의 개수이다
바닥의로부터의 거리 - 쌓여있는 박스의 개수 를 더해줬다
이게 진짜 코드가 이해가 안가서 빡쳤는데 박스는 밑으로만 이동한다는걸 내가 간과했다.....
하 머리아프다 나중에 다시 설명을 써야지...
출처
https://www.acmicpc.net/problem/9455
'자료구조&알고리즘 > 백준' 카테고리의 다른 글
[C++] 백준 1676번 - 팩토리얼 0의 개수 (0) | 2023.03.22 |
---|---|
[C++] 백준 15552번 - 빠른 A+B (0) | 2023.03.21 |
[C++] 백준 5576번 - 콘테스트 (1) | 2023.03.20 |
[C++] 백준 10814번 - 나이순 정렬 (0) | 2023.03.18 |
[C++] 백준 11050번 - 이항 계수1 (0) | 2023.03.12 |
Comments