지우너

[코드트리] 1차원 젠가 C++ 본문

Problem Solving

[코드트리] 1차원 젠가 C++

지옹 2024. 6. 6. 10:06

문제

https://www.codetree.ai/missions/2/problems/jenga-1d?&utm_source=clipboard&utm_medium=text

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

계획세우기

  1. blocks 값은 1이상 100이하니까 지울 범위가 들어오면 0으로 다 지워준다.
  2. 첫번째 0은 제거할 범위의 시작지점 start이므로 이 뒤에 숫자가 있다면 이 자리에 숫자를 채워주면 된다.
  3. 제거는 연속된 범위로 됐기 때문에 해당자리에 숫자를 채우고, endOfArr(다음에 값을 채울 idx)를 1증가시켜주면 된다.
  4. 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이 된다.)

 

풀이

#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;
}