지우너
[코드트리] 1차원 젠가 C++ 본문
문제
https://www.codetree.ai/missions/2/problems/jenga-1d?&utm_source=clipboard&utm_medium=text
계획세우기
- blocks 값은 1이상 100이하니까 지울 범위가 들어오면 0으로 다 지워준다.
- 첫번째 0은 제거할 범위의 시작지점 start이므로 이 뒤에 숫자가 있다면 이 자리에 숫자를 채워주면 된다.
- 제거는 연속된 범위로 됐기 때문에 해당자리에 숫자를 채우고, endOfArr(다음에 값을 채울 idx)를 1증가시켜주면 된다.
- n은 블록의 갯수를 의미하는데 start에서 end범위의 블록이 없어졌기 때문에 end-start+1만큼 n에서 빼주면 된다.
- (n-=(end-start+1), 예를 들어 n=6인데, 2에서 4까지를 제거한다고 하면 {1,
2, 3, 4,5, 6} n=n-(4-2+1)=3이 된다.)
- (n-=(end-start+1), 예를 들어 n=6인데, 2에서 4까지를 제거한다고 하면 {1,
풀이
#include <iostream>
using namespace std;
int n;
int blocks[101];// 1<=blocks[i]<=100
void RemoveBlocks(int start, int end){
// 제거
for(int i=start; i<=end; i++){
blocks[i]=0;
}
// 앞으로 당기기
int endOfArr=start;
for(int i=start; i<n; i++){
if(blocks[i]!=0){
blocks[endOfArr]=blocks[i];
blocks[i]=0;
endOfArr++;
}
}
n-=(end-start+1);
}
int main() {
cin >> n;
for(int i=0; i<n; i++){
cin >> blocks[i];
}
int s, e;
cin >> s >> e;
RemoveBlocks(s-1, e-1);
cin >> s >> e;
RemoveBlocks(s-1, e-1);
// output
cout << n << '\n'; // 남은 블록의 갯수
for(int i=0; i<n; i++){
cout << blocks[i] <<'\n'; // 남은 블록에 적힌 숫자들
}
return 0;
}
'Problem Solving' 카테고리의 다른 글
[코드트리] 숫자가 더 큰 인접한 곳으로 이동 C++ (0) | 2024.06.07 |
---|---|
[코드트리] 십자 모양 폭발 C++ (0) | 2024.06.07 |
[코드트리] 최단 Run Length 인코딩 C++ (0) | 2024.06.06 |
[코드트리] 기울어진 직사각형의 회전 C++ (0) | 2024.06.05 |
[코드트리] 2차원 바람 C++ (0) | 2024.06.04 |