https://www.acmicpc.net/problem/10703
#문제 간단 정리
//만약 가장 낮은 위치에 있는 유성과
//그 열에 가장 낮은 위치의 유성 - 가장 높은 위치에 있는 땅
//그 값들의 최소값 만큼 내려 올 수 있다.
#문제 해결 방법
전반적으로 구현 문제기 때문에 위와 같이 해결 할 수 있는데
반례를 잘 찾아야 될 것 같다.
일단 주어진 테스트케이스에서는 무조건 땅이 존재 하는것 같다.
그래서 땅이 없는 경우에는 테스트케이스가 존재 하지 않는 것 같고
땅이 있는부분과 없는 부분이 나눠진 테스트케이스가 존재하는 것 같은데
이 경우에는 땅이 있는 곳의 유성과의 차이만큼 내려주도록 구현을 해야 된다.
만약 전부 땅이 없는 경우에는 내 코드는 오류가나는데
이는 상정 안된 부분인듯하지만 딱히 명시는 안되있다.
#전체 코드
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <cmath>
#include <climits>
using namespace std;
int main() {
int r, s;
cin >> r >> s;
//만약 가장 낮은 위치에 있는 유성과
//그 열에 가장 낮은 위치의 유성 - 가장 높은 위치에 있는 땅
//그 값들의 최소값 만큼 내려 올 수 있다.
vector<vector<char>> board(r,vector<char>(s));
for (int i = 0; i < r; i++) {
string input;
cin >> input;
//board 에 입력
for (int j = 0; j < s; j++) {
board[i][j] = input[j];
}
}
int minDiff = INT_MAX;
//열을 순회하면서 가장 작은 차이를 고른다
for (int i = 0; i < s; i++) {
int maxMeteor = -1;
int maxGround = INT_MAX;
for (int j = 0; j < r; j++) {
if (board[j][i] == 'X') {
maxMeteor = j;
}
if (board[j][i] == '#' && maxGround == INT_MAX) {
maxGround = j;
}
}
// 유성이 있고, 그 아래에 땅이 있는 경우만 계산
if (maxMeteor != -1 && maxGround != INT_MAX) {
minDiff = min(maxGround - maxMeteor , minDiff);
}
}
//minDiff 만큼 유성을 아래로 내린다.
//아래부터 탐색해서 중복을 없앤다
for (int i = r - 1; i >= 0; i--) {
for (int j = 0; j < s; j++) {
if (board[i][j] == 'X') {
board[i][j] = '.';
board[i + minDiff-1][j] = 'X';
}
}
}
//복원 후 출력
for (int i = 0; i < r; i++) {
for (int j = 0; j < s; j++) {
cout << board[i][j];
}
cout << '\n';
}
return 0;
}
'[백준] > C++' 카테고리의 다른 글
백준 8972번 미친 아두이노 [C++] (0) | 2024.07.18 |
---|---|
백준 2638번 치즈 [C++] (0) | 2024.07.18 |
백준 1456번 거의 소수 [C++] (0) | 2024.07.08 |
백준 30677번 반짝반짝 빛나는 별가루 [C++] (0) | 2024.07.06 |
백준 1213번 펠린드롬 만들기 [C++] (0) | 2024.07.05 |