본문 바로가기
코딩테스트!(프로그래머스 & 백준)/프로그래머스-C++

코딩테스트 -- 야간 전술보행 - (프로그래머스 / C++)

by Lee_story_.. 2022. 10. 30.
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제!


전쟁에 참여한 화랑이는 적군의 기지에 침투하여 정보를 훔쳐오는 임무를 받았습니다. 화랑이는 야간 전술 보행을 이용하여 직진하며, 야간 전술 보행은 1m/s의 일정한 속도로 나아갈 수 있습니다. 화랑이의 침입 경로에는 경비병들이 각자 일부 구간들을 감시하고 있습니다. 각각의 경비병들이 감시하는 구간은 서로 겹치지 않으며, 일정 시간 동안 근무 후 일정 시간 동안 휴식을 취하는 과정을 반복합니다. 화랑이가 지나가고 있는 위치를 감시하는 경비병이 근무 중이라면 화랑이는 경비병에게 발각되어 즉시 붙잡히게 됩니다. 하지만 해당 위치를 감시하는 경비병이 휴식을 취하고 있으면 화랑이는 무사히 해당 위치를 지나갈 수 있습니다. 경비병의 근무 정보를 모르는 화랑이는 쉬지 않고 전진을 하며, 화랑이가 출발할 때 모든 경비병들이 동시에 근무를 시작합니다.

예를 들어, 적군 기지까지의 거리가 10m이고 2명의 경비병들이 근무를 시작한다고 가정합시다. 첫 번째 경비병의 감시 구간은 화랑이의 출발 위치로부터 3m부터 4m까지이고, 두 번째 경비병의 감시 구간은 화랑이의 출발 위치로부터 5m부터 8m까지입니다. 첫 번째 경비병의 근무 및 휴식 시간은 각각 2초, 5초를 반복하며, 두 번째 경비병의 근무 및 휴식 시간은 각각 4초, 3초를 반복합니다. 이 경우 출발지로부터 화랑이의 위치에 따른 두 경비병의 상태는 아래 표와 같습니다. 첫 번째 경비병이 감시하는 3m ~ 4m 구간을 화랑이는 3초일 때 진입하지만, 첫 번째 경비병은 2초간의 근무를 마치고, 휴식을 시작했으므로, 화랑이는 붙잡히지 않습니다. 하지만 두 번째 경비병이 감시하는 5m ~ 8m 구간에서 화랑이가 8m 지점에 진입했을 때, 두 번째 경비병이 3초간의 휴식을 마치고 근무를 시작하므로 화랑이는 붙잡히게 됩니다.

첫 번째 경비병의 상태 근무 근무 휴식 휴식 휴식 휴식 휴식 근무 근무 휴식
두 번째 경비병의 상태 근무 근무 근무 근무 휴식 휴식 휴식 근무 근무 근무
화랑이의 위치 1 2 3 4 5 6 7 8 9 10

화랑이의 현재 위치와 적군 기지 사이의 거리를 나타내는 정수 distance, 각 경비병의 감시 구간을 담은 2차원 정수 배열 scope, 같은 순서로 각 경비병의 근무 시간과 휴식 시간을 담은 2차원 정수 배열 times가 주어질 때, 화랑이가 경비를 피해 최대로 이동할 수 있는 거리를 return 하는 solution 함수를 완성하세요.

 


요약하면 1초당1m씩가는 화랑이가 최대한 갈수있는 지점을 구하는 문제였습니다

 

알고리즘이 아닌, 코드를 잘 구성할수있냐는 그런 문제였던것 같습니다..

 

 

그럼 바로시작!


먼저 저는 화랑의 기준으로 벡터를 하나 만들어 주었습니다.

vector<int>list(distance+1,0);   // 1~distance까지   // 현재위치에 현재시간에 감시가 들어오는지 판단

초당 = 위치값 이므로 모든 경비병을 탐색해주면서 이 위치에 시간에 감시를 하고 있는지 저장해줍시다

 

경비병마다 1~ 가야할 총 거리 distance = all_time까지 돌려 줍시다!

 for(int i=0;i<scope.size();i++){//경비병  
        int time=1;
        
        int check_play=times[i][0];// 근무시간

 

일할때는 1의 값을 리스트에 넣어주고 

 while(time<=scope[i][1]){ // 1초부터 연산
            if(check_play){//일하는중
                if(scope[i][0]<= time and scope[i][1]>=time){// 값 넣어주기
                    list[time]=1;
                }
                time+=1;
                check_play-=1;
            }
            else{//휴식시간처리
                time+=times[i][1];
                check_play=times[i][0];

            }
        }

작업이 끝났다면? 휴식시간은 time+=1 이 아닌 time+= 휴식시간 으로 처리해줍시다!

 

여기까지가 끝!

 

인줄 알았지만 어딘가 틀리네요...

 

 

오류에 대해서 생각해본 결과 scope !

구간의 값이 항상 정렬된 3~4가 아닌  4~3 으로 입력 들어올수있다는 점을 찾았습니다;;

 

 

이부분은 아래처럼 swap으로 해결해주었습니다!

////-----추가
        if(scope[i][0]>scope[i][1]){
            int memo=scope[i][1];
            scope[i][1]=scope[i][0];
            scope[i][0]=memo;
        }

 

 

여기까지가 진짜 끝!

#include <string>
#include <vector>

#include <iostream>
using namespace std;

int solution(int distance, vector<vector<int>> scope, vector<vector<int>> times) {
    int answer = 0;
    vector<int>list(distance+1,0);   // 1~distance까지   // 현재위치에 현재시간에 감시가 들어오는지 판단 
    
    for(int i=0;i<scope.size();i++){//경비병  
        int time=1;
        
        int check_play=times[i][0];
        
        ////-----추가
        if(scope[i][0]>scope[i][1]){
            int memo=scope[i][1];
            scope[i][1]=scope[i][0];
            scope[i][0]=memo;
        }
        
        
        while(time<=scope[i][1]){ // 1초부터 연산
            if(check_play){//일하는중
                if(scope[i][0]<= time and scope[i][1]>=time){// 값 넣어주기
                    list[time]=1;
                }
                time+=1;
                check_play-=1;
            }
            else{//휴식시간처리
                time+=times[i][1];
                check_play=times[i][0];

            }
        }
    }
    
    for(int i=1;i<list.size();i++){
        answer+=1;
        
        if(list[i]==1){
            break;
        }
    }
    
    return answer;
}

 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글