일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- BFS
- 파이어베이스
- dp
- 코드트리조별과제
- 시뮬레이션
- 안드로이드
- map
- 그래프 이론
- 백트래킹
- 코드트리 조별과제
- 백준
- 맵
- 분할정복
- 멀티맵
- 브루트포스
- 에러
- 다이나믹 프로그래밍
- 코틀린
- 코딩테스트
- 코드트리
- c++풀이
- 문자열
- c++
- 풀이
- 파이어스토어
- 다익스트라
- 그래프 탐색
- 그래프
- dfs
- 자료 구조
- Today
- Total
Kangho_Story
[코드트리 조별과제] 십자 모양 폭발 C++ 풀이 본문
알고리즘 분류
- 시뮬레이션
문제 설명
입력 설명
첫 번째 줄에는 격자의 크기를 나타내는 n이 주어집니다.
두 번째 줄 부터는 n개의 줄에 걸쳐 각 행에 해당하는 n개의 숫자가 공백을 사이에 두고 주어집니다.
그 다음 줄에는 폭탄이 터질 중심 위치의 정보를 나타내는 (r, c) 값이 공백을 사이에 두고 주어집니다. 이는 r행 c열이 중심 위치임을 의미합니다.
- 1 ≤ n ≤ 200
- 1 ≤ r, c ≤ n
출력 설명
폭탄이 터지고 나서 중력이 작용한 뒤의 결과를 출력합니다.
n개의 줄에 걸쳐 각 행에 해당하는 n개의 숫자를 공백을 사이에 두고 출력합니다. 만약 해당 위치에 아무 숫자도 적혀있지 않은 경우라면 0을 출력합니다.
예제 입력
4
1 2 4 3
3 2 2 3
3 1 6 2
4 5 4 4
2 3
4
1 2 4 3
3 2 2 3
3 1 6 2
4 5 4 4
3 3
예제 출력
1 0 0 0
3 2 0 3
3 1 0 2
4 5 4 4
0 0 0 0
1 2 0 3
3 2 0 3
4 5 0 4
아이디어
주어진 좌표로 이동해서 들어있는 숫자만큼 상하좌우를 모두 0으로 변경한다.
이후 1열씩 탐색하여 아래 방향으로 숫자를 내린다.
알고리즘
주어진 좌표로 이동해서 들어있는 숫자만큼 상하좌우를 모두 0으로 변경한다.
2차원 temp과 1차원 temp 배열을 선언하여 기존 배열을 1열씩 탐색하여 그 값이 0이 아니라면 1차원 temp 배열에 넣는다.
이후 1차원 temp 배열의 값을 올바른 2차원 temp 배열에 옮긴다.
이를 n번 반복하면 중력 방향으로 숫자가 내려간 2차원 temp 배열이 완성되므로 이를 출력한다.
코드
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> gravity(vector<vector<int>> &vec, int n)
{
vector<vector<int>> temp_2d(n+1, vector<int>(n+1,0));
for(int j=1;j<=n;j++)
{
vector<int> temp(1,0);
for(int i = 1; i <= n; i++)
if(vec[i][j] != 0) temp.push_back(vec[i][j]);
while(temp.size() < n+1)
temp.insert(temp.begin(),0);
for(int i = 1; i <= n; i++)
temp_2d[i][j] = temp[i];
}
return temp_2d;
}
int main() {
int n, r, c;
cin>>n;
vector<vector<int>> vec(n+2,vector<int>(n+2,-1));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>vec[i][j];
cin>>r>>c;
int boom = vec[r][c];
for(int i=0;i<boom;i++)
{
if(0 < r+i && r+i <= n && vec[r+i][c] != -1) vec[r+i][c] = 0;
if(0 < r-i && r-i <= n && vec[r-i][c] != -1) vec[r-i][c] = 0;
if(0 < c+i && c+i <= n &&vec[r][c+i] != -1) vec[r][c+i] = 0;
if(0 < c-i && c-i <= n &&vec[r][c-i] != -1) vec[r][c-i] = 0;
}
vec = gravity(vec, n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cout<<vec[i][j]<<" ";
}
cout<<"\n";
}
return 0;
}
후기
문제 링크 -> https://www.codetree.ai/missions/2/problems/cross-shape-bomb?&utm_source=clipboard&utm_medium=text
배열은 자주 다뤄봤지만, 격자 안에서 터지고 떨어지는 경우는 처음 다뤄봐서 신선해서 좋았다.
본 블로그의 모든 글은 개인적인 학습 내용이므로 다양한 오류가 있을 수 있습니다.
오류를 발견하신다면 해당 내용 댓글로 알려주시면 감사하겠습니다!
'PS' 카테고리의 다른 글
[코드트리 조별과제] 십자 모양의 지속적 폭발 C++ 풀이 (0) | 2024.07.22 |
---|---|
[백준] 11279번 최대 힙 C++ 풀이 (0) | 2024.07.19 |
[코드트리 조별과제] 최단 Run Length 인코딩 C++ 풀이 (0) | 2024.07.18 |
[코드트리 조별과제] 양수 직사각형의 최대 크기 C++ 풀이 (0) | 2024.07.18 |
[백준] 11724번 연결 요소의 개수 C++ 풀이 (0) | 2024.07.18 |