코딩테스트/C++

[프로그래머스 Level 2] 지게차와 크레인 (C++)

최-코드 2025. 2. 26. 09:26

https://school.programmers.co.kr/learn/courses/30/lessons/388353

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

생각 흐름

  • 입력이 100, 50, 50으로 최대로 계산했을 때 250000 밖에 안 되는 것을 파악.
  • 1초안에 성공하려면 400회의 이내로 연산이 진행되어야 함을 파악.
  • size 2일 때는 추가 연산 과정 없이 바로 없애주면 되므로 문제 안 됨.
  • size 1일 때 bfs를 통해 외부와 닿아있는 것들을 저장하는 방식으로 결정. 이 때 외부와 닿아있다고 바로 제거해주면 안 됨.

 

 

#include <string>
#include <vector>
#include <queue>
#include <memory.h>

using namespace std;

int moveX[4] = {0,0,1,-1};
int moveY[4] = {1,-1,0,0};

bool validateEdge(int y, int x, vector<string> storage){
    queue<pair<int, int>> q;
    q.emplace(y,x);
    bool checked[50][50];
    memset(checked, false, sizeof(checked));
    while(!q.empty()){
        pair<int, int> node = q.front();
        q.pop();
        if(node.first<0 || node.first>=storage.size() || node.second<0 || node.second>=storage[0].size()){
            return true;
        }
        if(storage[node.first][node.second]!=0 || checked[node.first][node.second]){
            if(node.first==y && node.second == x){
                
            }else{
                continue;
            }
        }
        
        checked[node.first][node.second] = true;
        
        for(int i = 0; i<4; i++){
            int movedX = node.second+moveX[i];
            int movedY = node.first+moveY[i];
            q.emplace(movedY, movedX);
        }
    }
    
    return false;
}

int solution(vector<string> storage, vector<string> requests) {
    int answer = 0;
    
    for(int i = 0; i<requests.size(); i++){
        vector<pair<int,int>> v;
        for(int j = 0; j<storage.size(); j++){
            for(int k = 0; k<storage[j].size(); k++){
                if(storage[j][k]==requests[i][0]){
                    if(requests[i].size()==1){
                        if(validateEdge(j, k, storage)) {
                            v.emplace_back(j,k);
                        }
                    }else{
                        storage[j][k]=0;
                    }
                }
            }
        }
        for(auto tmp : v){
            storage[tmp.first][tmp.second] = 0;
        }
    }
    
    for(int j = 0; j<storage.size(); j++){
        for(int k = 0; k<storage[j].size(); k++){
            if(storage[j][k]!=0){
                answer++;
            }
        }
    }
    
    return answer;
}