Baekjoon Online Judge
9455번: 박스
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 m과 n이 주어진다. (1 ≤ m, n ≤ 100) 다음 m개 줄에는 그리드의 각 행의 정보를 나타내는 n개의 정수가 주어진다. 그
www.acmicpc.net
[문제]
m행 n열로 이루어진 그리드가 주어진다. 일부 칸에는 박스가 들어 있다. 모든 박스가 더 이상 움직일 수 없을 때 까지 아래로 움직인다면, 박스는 쌓여진 상태가 된다.
그림 (a)의 그리드의 크기는 5행 4열이고, 7칸에는 박스가 들어있다. 모든 박스가 계속해서 아래로 움직이면, 그림 (b)와 같이 변하게 된다.
박스가 움직인 거리는 바닥에 쌓이기 전 까지 이동한 칸의 개수이다. 예를 들어, 맨 왼쪽 열에서 가장 위에 있는 박스가 움직인 거리는 2이다. 모든 박스가 이동한 거리 (각 박스가 이동한 거리의 합) 을 구하는 프로그램을 작성하시오. 위의 예제에서 박스 7개가 움직인 거리는 8이다.
[입력]
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 m과 n이 주어진다. (1 ≤ m, n ≤ 100) 다음 m개 줄에는 그리드의 각 행의 정보를 나타내는 n개의 정수가 주어진다. 그리드 첫 행부터 마지막 행까지 순서대로 주어진다. 박스가 들어있는 칸은 1로, 다른 칸은 0으로 주어진다. 각 정수 사이에는 공백이 하나 주어진다.
[출력]
각 테스트 케이스마다 입력으로 주어진 그리드에서 모든 박스가 이동한 거리를 출력한다.
[코드]
#include <iostream>
using namespace std;
int main()
{
int T, m, n;
cin >> T;
while (T--)
{
cin >> m >> n;
int a[100][100], cnt = 0;
for (int i = m - 1; i >= 0; i--)
{
for (int j = 0; j < n; j++)
cin >> a[i][j];
}
for (int j = 0; j < n; j++)
{
for (int i = 1; i < m; i++)
{
int tmp = i;
while (1)
{
if (a[tmp][j] == 1 && a[tmp - 1][j] == 0)
{
a[tmp][j] = 0;
a[tmp - 1][j] = 1;
cnt++;
tmp--;
if (tmp == 0)
break;
}
else
break;
}
}
}
cout << cnt << '\n';
}
return 0;
}
(수정 전 코드)
#include <iostream>
using namespace std;
int main()
{
int T, m, n;
cin >> T;
while (T--)
{
cin >> m >> n;
int a[100][100], cnt = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
cin >> a[i][j];
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (a[j][i] == 1)
{
for (int k = j + 1; k < m; k++)
{
if (a[k][i] == 0)
cnt++;
}
}
}
}
cout << cnt << '\n';
}
return 0;
}
(수정 후 코드)
처음 짠 코드가 복잡해 보여서 수정했는데
수정한 코드도 깔끔하게 나오진 않은 것 같다.
'Baekjoon > C++' 카테고리의 다른 글
[C++][BOJ/백준] 10874 이교수님의 시험 (0) | 2024.03.08 |
---|---|
[C++][BOJ/백준] 11931 수 정렬하기 4 (1) | 2024.03.06 |
[C++][BOJ/백준] 2684 동전 게임 (0) | 2024.03.02 |
[C++][BOJ/백준] 10804 카드 역배치 (0) | 2024.03.01 |
[C++][BOJ/백준] 3040 백설 공주와 일곱 난쟁이 (2) | 2024.02.29 |