문제
Softeer
제한시간 : C/C++(1초), Java/Python(2초) | 메모리 제한 : 256MB 동일한 자동차를 생산하는 2개의 조립 라인 A와 B가 있다. 두 조립라인에는 각각 N개의 작업장이 있다. 각각의 작업장을 Ai (1 ≤ i ≤ N)와 Bi
softeer.ai
- 동일한 자동차를 생산하는 2개의 조립 라인 A와 B가 있다.
- 두 조립라인에는 각각 N개의 작업장이 있다.
- 각각의 작업장을 Ai (1 ≤ i ≤ N)와 Bi (1 ≤ i ≤ N)로 표시한다.
- Ai 작업장과 Bi 작업장은 동일한 작업을 수행하지만 작업시간은 다를 수 있다.
- Ai 작업장에서 Bi+1 작업장으로 혹은 Bi 작업장에서 Ai+1 작업장으로 반조립 제품의 이동이 가능하다. (이동시간이 추가됨)
- 작업장의 수가 N일때 1 ≤ N ≤ 10^3 인 정수이다.
- 각 작업시간과 이동시간은 10^5를 넘지 않는 양의 정수이다.
- 이때 자동차 1대의 가장 빠른 조립 시간을 구하는 문제이다.
알고리즘
- 작업장의 수를 입력받는다.
- 반복문을 통해 리스트 형식으로 각 작업장의 시간을 입력받고 리스트 변수에 넣는다.
- 마지막 작업장 시간을 입력받아 리스트 변수에 넣는다.
- 작업장의 수가 1개일 경우에는 마지막 작업장 시간 중 최소인 시간을 출력한다.
- 오로지 a라인에서 작업한 시간과 b라인에서 작업하고 a라인으로 이동한 시간을 비교한다.
- 그중에서 최소 시간을 총 걸린 시간에 넣고 이전 라인에서 걸린 시간에 넣는다.
- b라인도 똑같은 작업을 하고 위 과정을 n-1만큼 반복한다.(마지막 작업장 시간은 따로 계산하기 위해)
- 반복문이 끝나면 각각의 마지막 작업장 시간을 각 라인 시간에서 총 걸린 시간에 더해준다.
- 각 라인에서 총 걸린 시간의 최소를 출력한다.
코드
import sys
n = int(sys.stdin.readline())
line = []
for i in range(n-1):
line.append(list(map(int, sys.stdin.readline().split())))
# 마지막 작업장 시간
finish = list(map(int, sys.stdin.readline().split()))
# 각 라인에서 총 걸리는 시간
time_a = 0
time_b = 0
# 각 작업장 라인중 이전 라인에서 걸린 시간
work_a = 0
work_b = 0
for i in range(n-1):
# n이 1일경우에는 작업장이 하나씩이기 때문에 둘중 제일 적은 시간인 경우에만 출력하면 된다.
if n == 1:
break
# 오로지 a라인에서 작업한 시간과 b라인에서 작업하고 a라인으로 이동한 시간 비교
time_a = min(line[i][0] + work_a, line[i][1] + line[i][3] + work_b)
# 오로지 b라인에서 작업한 시간과 a라인에서 작업하고 b라인으로 이동한 시간 비교
time_b = min(line[i][1] + work_b, line[i][0] + line[i][2] + work_a)
# 각 라인에 최소 작업시간을 이전 라인에서 걸린 시간에 넣는다.
work_a = time_a
work_b = time_b
# 각각의 마지막 작업장 시간을 각 라인에서 총 걸린 시간에 더해준다.
time_a += finish[0]
time_b += finish[1]
# 각 라인에서 총 걸린 시간의 최소를 출력한다.
print(min(time_a, time_b))
결과
위 코드에서 for문 끝에 print(time_a, time_b)를 작성하면 각 라인의 작업장에서 총 걸리는 시간을 출력 화면과 같이 확인할 수 있다.
(편의상 작업시간과 이동시간의 단위는 시간으로 하겠다.) 위 출력 화면을 보게 되면 a 라인의 첫 번째 작업장에서 작업을 하고 a 라인의 두 번째 작업장으로 이동한 시간인 1시간이 b 라인의 첫 번째 작업장에서 작업을 하고 a 라인의 두 번째 작업장으로 이동한 시간인 4시간보다 더 최소 시간이기 때문에 a라인에서 걸린 최소 시간은 1시간이 된다. 또, b 라인의 첫 번째 작업장에서 작업을 하고 b 라인의 두 번째 작업장으로 이동한 시간인 3시간보다 a 라인의 첫 번째 작업장에서 작업을 하고 b 라인의 두 번째 작업장으로 이동한 시간인 2시간이 더 최소 시간이기 때문에 b라인에서 걸린 최소 시간은 2시간이 된다. 그리고 마지막 작업장인 두 번째 작업장의 작업 시간을 더해주면 최종적으로 각 라인에서 걸리는 최소 작업시간이 나온다. 따라서 a라인은 11시간이 걸리고 b라인은 4시간이 걸리기 때문에 가장 빠르게 자동차를 조립하는데 걸리는 시간은 4시간이 된다.
따라서 코드를 분석하게 되면 각 라인에서 두 가지 경우(a -> a, b -> a)의 조립 방법 중 최종적으로 걸리는 최소 시간을 도출해내고 그 두 개의 시간 중 최소를 출력하면 가장 빠르게 자동차를 조립하는데 걸리는 시간이 나오게 된다. 이때, 이전 작업장에서 걸린 최소 시간을 포함해야 정확한 답을 찾을 수 있다.
github
junjange/CodingTest
내가 푼 코딩 테스트 문제와 해결법. Contribute to junjange/CodingTest development by creating an account on GitHub.
github.com
'CodingTest > Softeer' 카테고리의 다른 글
[softeer] 소프티어(파이썬): 징검다리2 ★★★★ (0) | 2021.09.24 |
---|---|
[softeer] 소프티어(파이썬): 동계 테스트 시점 예측★★★ (0) | 2021.09.24 |
[softeer] 소프티어(파이썬): 장애물 인식 프로그램 ★★ (0) | 2021.05.18 |
[softeer] 소프티어(파이썬): 8단 변속기 ★★ (0) | 2021.05.18 |
[softeer] 소프티어(파이썬): 수퍼바이러스 ★★★ (0) | 2021.05.17 |