본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 2 : 야간 전술보행 C언어

by starfish22 2022. 10. 31.
728x90

▶문제 : 코딩 테스트 연습 - 야간 전술 보행 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int solution(int distance, int **scope, size_t scope_rows, size_t scope_cols, int **times, size_t times_rows, size_t times_cols) {
    int point, time, temp, min = distance;
    
    for (int i = 0; i < scope_rows; i++) {
        if (scope[i][0] > scope[i][1]) {//작은 값을 scope[i][0]에 대입
            temp = scope[i][0];
            scope[i][0] = scope[i][1];
            scope[i][1] = temp;
        }
        time = times[i][0] + times[i][1];//근무, 휴식 시간의 합
        point = time * (scope[i][0] / time);//scope[i][0]를 넘지 않을 때까지의 위치 도착
        if (min < point) continue;//도착한 위치가 이전에 잡혔을 때 위치보다 크면 넘어가기

        if (point == scope[i][0]) min = scope[i][0] + 1;
        //딱 맞게 도착하면 바로 다음이 근무시간이므로 잡힘
        else if (point + times[i][0] >= scope[i][0]) min = scope[i][0];
        //근무시간일 때 근무구간 안에 있을 때 잡힘
        else if (point + time < scope[i][1]) min = point + time + 1;
        //근무시간과 휴식시간을 지나서 다시 근무시간일 때도 근무구간을 벗어나지 않았다면 잡힘
    }
    return min;
}

 

▶해석

문제를 분석하면 화랑이가 위치 1부터 시작해서 각 경비병의 근무 구간에 위치했을 때 근무시간과 겹치면 잡히는 것이다.

따라서 각 경비병의 근무시간과 휴식시간을 위치 1부터 번갈아가면서 시간을 보냈을 때

근무 구간일 때와 근무시간일 때 겹치는지 확인하면 풀린다.

(1m/s 속도로 일정하게 움직이기 때문에 시간=위치라고 생각할 수 있다)

 

for문으로 scope배열의 행만큼 반복하고, scope배열이 정렬되어있지 않아서 작은 값이 scope [i][0]가 되도록 하였다.

(문제를 제대로 읽지 않아 정렬 안된 걸로 1시간 동안 뻘짓을 했다)

위치 1부터 번갈아가면서 근무시간과 휴식시간을 계산하기 위해 둘의 합을 time변수에 대입하였다.

point변수는 현재 위치를 표시하는데 계산식으로는

time으로 scope [i][0]를 나누어 몇 번 만에 scope [i][0]를 넘기 전까지 갈 수 있는지 횟수를 구하였고,

그 횟수를 time에 곱함으로써 scope [i][0]를 넘기 전까지의 위치에 도달할 수 있다.

 

예를 들어

근무 구간 [20,30] , 근무 시간과 휴식시간을 각각 [2, 6]이라고 하면

time = 8이고, scope [i][0]/time = 20/8 = 2이다(정수로 나온다)

거기에 time을 곱하면 time*2 = 16으로 point = 16이 나온다.

이제 여기에 근무 시간을 더하면 18인데 근무 구간 밖이므로 잡히지 않고,

거기에 휴식시간을 더하면 24가 되고, 다시 근무 시간이므로 25일 때 잡힌다.

 

위의 예처럼 구할 때 3가지의 경우의 수를 if문으로 작성하였다.

1. time변수가 scope [i][0]를 나누었을 때 딱 떨어진다면 point == scope [i][0]가 되어

다음 차례가 근무 시간이므로 scope [i][0]+1 일 때 잡힌다.

 

2. point 위치에서 근무 시간을 더했을 때 scope [i][0]와 같거나 크다면

근무 시간과 근무 구간이 겹치므로 scope [i][0] 일 때 잡힌다.

 

3. point 위치에서 time을 더했는데 scope [i][1]보다 작다면

근무 시간 한 번, 휴식 시간 한 번을 가지고, 다시 근무 시간을 가졌는데 근무 구간과 겹친다는 의미이므로

point+time+1 일 때 잡힌다.

728x90

댓글