-
야간 전술보행코딩 테스트/Level 2 2022. 11. 9. 22:44반응형
https://school.programmers.co.kr/learn/courses/30/lessons/133501
문제에 오류가 있어 프로그래머스에 수정을 요청했다.
잘못된 보기를 고치랬더니 문제를 억지스럽게 수정했다.
경비병은 1초 후에 감시를 시작한다라... ㅎㅎㅎsolution = lambda distance, scopes, times: result[0] if (result := [index for scope, time in sorted(zip(scopes, times)) for index in range(min(scope), max(scope) + 1) if (index - 1) % sum(time) < time[0]]) else distance
약간 억지스러운 부분도 있지만 한줄로 코딩하기 위해...
프로그래머스보단 덜 억지스럽다.테스트 1 〉 통과 (0.01ms, 10.2MB) 테스트 2 〉 통과 (555.35ms, 66.3MB) 테스트 3 〉 통과 (0.70ms, 10.4MB) 테스트 4 〉 통과 (1.63ms, 10.4MB) 테스트 5 〉 통과 (0.35ms, 10.3MB) 테스트 6 〉 통과 (0.03ms, 10.2MB) 테스트 7 〉 통과 (0.62ms, 10.4MB) 테스트 8 〉 통과 (1.40ms, 10.7MB) 테스트 9 〉 통과 (1.43ms, 10.7MB) 테스트 10 〉 통과 (0.10ms, 10.2MB) 테스트 11 〉 통과 (1.71ms, 10.5MB) 테스트 12 〉 통과 (0.42ms, 10.4MB) 테스트 13 〉 통과 (1.76ms, 10.5MB) 테스트 14 〉 통과 (2.69ms, 10.4MB)
def solution(distance, scopes, times): for scope, time in sorted(zip(scopes, times)): for index in range(min(scope), max(scope) + 1): if (index - 1) % sum(time) < time[0]: return index return distance
테스트 1 〉 통과 (0.01ms, 10.2MB) 테스트 2 〉 통과 (0.44ms, 10.4MB) 테스트 3 〉 통과 (0.16ms, 10.3MB) 테스트 4 〉 통과 (0.08ms, 10.2MB) 테스트 5 〉 통과 (0.03ms, 10.3MB) 테스트 6 〉 통과 (0.02ms, 10MB) 테스트 7 〉 통과 (0.14ms, 10.2MB) 테스트 8 〉 통과 (0.47ms, 10.5MB) 테스트 9 〉 통과 (0.47ms, 10.3MB) 테스트 10 〉 통과 (0.03ms, 10.1MB) 테스트 11 〉 통과 (0.57ms, 10.4MB) 테스트 12 〉 통과 (0.14ms, 10.3MB) 테스트 13 〉 통과 (0.58ms, 10.5MB) 테스트 14 〉 통과 (0.61ms, 10.5MB)
def solution(distance, scopes, times): for scope, time in sorted(zip(scopes, times)): sum_time = sum(time) for index in range(min(scope), max(scope) + 1): if (index - 1) % sum_time < time[0]: return index return distance
테스트 1 〉 통과 (0.03ms, 10.2MB) 테스트 2 〉 통과 (0.70ms, 10.3MB) 테스트 3 〉 통과 (0.10ms, 10.3MB) 테스트 4 〉 통과 (0.15ms, 10.1MB) 테스트 5 〉 통과 (0.03ms, 10.2MB) 테스트 6 〉 통과 (0.01ms, 10MB) 테스트 7 〉 통과 (0.09ms, 10.1MB) 테스트 8 〉 통과 (0.50ms, 10.2MB) 테스트 9 〉 통과 (0.90ms, 10.4MB) 테스트 10 〉 통과 (0.05ms, 10.1MB) 테스트 11 〉 통과 (0.58ms, 10.2MB) 테스트 12 〉 통과 (0.26ms, 10MB) 테스트 13 〉 통과 (0.59ms, 10.4MB) 테스트 14 〉 통과 (0.62ms, 10.4MB)
------------------------------------------
이것은 수정 전 문제에 관한 해설입니다.
문제 설명
전쟁에 참여한 화랑이는 적군의 기지에 침투하여 정보를 훔쳐오는 임무를 받았습니다. 화랑이는 야간 전술 보행을 이용하여 직진하며, 야간 전술 보행은 1m/s의 일정한 속도로 나아갈 수 있습니다. 화랑이의 침입 경로에는 경비병들이 각자 일부 구간들을 감시하고 있습니다. 각각의 경비병들이 감시하는 구간은 서로 겹치지 않으며, 일정 시간 동안 근무 후 일정 시간 동안 휴식을 취하는 과정을 반복합니다. 화랑이가 지나가고 있는 위치를 감시하는 경비병이 근무 중이라면 화랑이는 경비병에게 발각되어 즉시 붙잡히게 됩니다. 하지만 해당 위치를 감시하는 경비병이 휴식을 취하고 있으면 화랑이는 무사히 해당 위치를 지나갈 수 있습니다. 경비병의 근무 정보를 모르는 화랑이는 쉬지 않고 전진을 하며, 화랑이가 출발할 때 모든 경비병들이 동시에 근무를 시작합니다.
예를 들어, 적군 기지까지의 거리가 10m이고 2명의 경비병들이 근무를 시작한다고 가정합시다. 첫 번째 경비병의 감시 구간은 화랑이의 출발 위치로부터 3m부터 4m까지이고, 두 번째 경비병의 감시 구간은 화랑이의 출발 위치로부터 5m부터 8m까지입니다. 첫 번째 경비병의 근무 및 휴식 시간은 각각 2초, 5초를 반복하며, 두 번째 경비병의 근무 및 휴식 시간은 각각 4초, 3초를 반복합니다. 이 경우 출발지로부터 화랑이의 위치에 따른 두 경비병의 상태는 아래 표와 같습니다. 첫 번째 경비병이 감시하는 3m ~ 4m 구간을 화랑이는 3초일 때 진입하지만, 첫 번째 경비병은 2초간의 근무를 마치고, 휴식을 시작했으므로, 화랑이는 붙잡히지 않습니다. 하지만 두 번째 경비병이 감시하는 5m ~ 8m 구간에서 화랑이가 8m 지점에 진입했을 때, 두 번째 경비병이 3초간의 휴식을 마치고 근무를 시작하므로 화랑이는 붙잡히게 됩니다.문제 설명에 오류가 있는 것 같다.
입출력 예 #1 에서
거리는 10미터, 속도는 1 m/s니까.
0미터에서 출발해서 10미터까지 직진.
0초에서 출발해서 10초에 도착한다.
"화랑이가 출발할 때 모든 경비병들이 동시에 근무를 시작합니다."
"두 번째 경비병의 근무 및 휴식 시간은 각각 4초, 3초를 반복합니다."
화랑이가 출발할 때 근무를 시작했으니...
[0초~4초): 4초의 근무시간
[4초~7초): 3초의 휴식시간
[7초~11초): 4초의 근무시간이다.
"두 번째 경비병이 감시하는 5m ~ 8m 구간에서 화랑이가 8m 지점에 진입했을 때,
두 번째 경비병이 3초간의 휴식을 마치고 근무를 시작하므로 화랑이는 붙잡히게 됩니다."
화랑이는 5~8미터 구간을 5초에 진입해 8초에 통과한다.
경비병은 [7초에서 11초까지) 근무한다.
따라서 7초에 7미터 지점에서 화랑이는 붙잡히게 된다.---------------------------------
주어진 문제를 코드로 옮겨 보았다.
모호한 부분이 많아... 이렇게만...from itertools import cycle def solution(distance, scopes, times): for scope, time in sorted(zip(scopes, times)): area = set(range(min(scope), max(scope))) for i, work in zip(range(distance), cycle([True] * time[0] + [False] * time[1])): if work and i in area: return i return distance
전체 distance를 감시 영역 개수만큼 반복하는 것은 꽤 시간이 걸리는 일이다.
전체를 반복하지 말고, 감시 영역만 반복하자.def solution(distance, scopes, times): for scope, time in sorted(zip(scopes, times)): for index in range(min(scope), max(scope)): if index % sum(time) < time[0]: return index return distance
solution = lambda distance, scopes, times: result[0] if (result := [index for scope, time in sorted(zip(scopes, times)) for index in range(range(min(scope), max(scope))) if index % sum(time) < time[0]]) else distance
더보기FOR 반복문이나 배열의 인덱스...
0에서 index를 시작하는 컴퓨터 언어가 있고,
1에서 시작하는 언어가 있다.대부분 0에서 시작하지만,
BASIC이나 FORTRAN, PASCAL 등은 1에서 시작한다.자세한 것은 다음 글을 참고하시고..
https://nanite.tistory.com/56이 문제는 인덱스와 직접적인 관련은 없지만(?), 비슷한 느낌이 있다.
시간이 포함된 문제는 기준을 잘 세워두는 것이 좋을 때가 많다.
반응형