본문 바로가기
알고리즘

Programmers - 외벽점검(C++)

by 장중앙 2021. 8. 20.

https://programmers.co.kr/learn/courses/30/lessons/60062

 

코딩테스트 연습 - 외벽 점검

레스토랑을 운영하고 있는 "스카피"는 레스토랑 내부가 너무 낡아 친구들과 함께 직접 리모델링 하기로 했습니다. 레스토랑이 있는 곳은 스노우타운으로 매우 추운 지역이어서 내부 공사를 하

programmers.co.kr

풀이

외벽을 점검하면서 0->n, n->0의 경우를 이어주기위해 weak를 이어붙임

ex) n=8, weak=[1, 4, 7] -> new_weak=[1, 4, 7, 8(1+n), 11(4+n), 14(7+n)]

 

문제 설명에 모든 경우에 대한 탐색(bruteforce)

   1. 어떤 친구를 배정할 것인지

   2. 취약지점 중 어느 곳을 시작지점를 배정할 것인지

   3. 시계방향 or 시계반대방향 중 어느 방향으로 돌 것인지(문제 풀이에 영향이 없다고 생각하고 시계방향으로만 배정)

 

#include <vector>
#include <algorithm>

using namespace std;

int solution(int n, vector<int> weak, vector<int> dist) {
    int answer = 987654321;
    int weak_size=weak.size();
    
    for(int i=0;i<weak_size;i++){
        weak.push_back(weak[i]+(n));
    }
    
    do{
        for(int start_pos=0;start_pos<n;start_pos++){//시작 위치 (0~n-1)
            //첫번째 사람을 배정
            int human_idx=0;
            int fix=1;
            int nowHuman_endPos=weak[start_pos]+dist[human_idx];
            
            for(int now=start_pos+1;now<weak.size();now++){//시작위치+1 부터 resize한 weak의 사이즈까지 확인
                if(fix==weak_size){//모든 취약 지점에 대한 배정이 끝남
                    answer=min(answer, human_idx+1);
                    break;
                }
                else if(nowHuman_endPos>=weak[now]){//현재 사람이 이동할 수 있는 거리에 다음 취약지점이 포함
                    fix++;
                }
                else{
                    if(human_idx==dist.size()-1)break;//남은 사람이 없다면 외벽을 전부 점검할 수 없다는 의미로 break하고 다음 조합으로 넘어감
                    //다음 취약지점이 현재 사람의 거리로 도달 할수 없으므로 다음 사람을 배정
                    human_idx++;
                    nowHuman_endPos=weak[now]+dist[human_idx];
                    fix++;
                }
            }
        }
        
    }while(next_permutation(dist.begin(), dist.end()));//누구부터 보낼건지에 대한 조합
    
    answer=(answer==987654321?-1:answer);
    
    return answer;
}

'알고리즘' 카테고리의 다른 글

Programmers - 광고삽입(C++)  (0) 2021.08.24
BOJ 1405 - 미친로봇(C++)  (0) 2021.08.24
BOJ 21608 - 상어초등학교(C++)  (0) 2021.08.19
Programmers - 다단계 칫솔 판매(C++)  (0) 2021.08.17
BOJ 10216 - Count Circle Groups(C++)  (0) 2021.08.16

댓글