변경이력

돌아가기
3 825개 문자 추가 4개 문자 삭제

2016/10/28 03:49

룰루랄라

다리로 이용할 리스트(길이가 w 이고 0으로 가득찬)를 준비해서 큐로 사용합니다. 다리의 내용을 한 칸 밀고, 남은 무게의 합과 대기열 중 가장 앞 트럭의 무게를 더해서 안전한 수준이면 다리 뒤에 추가합니다. 그렇지 않으면 0을 추가합니다. 대기열에 트럭이 없는 경우에도 다리는 0을 밀어넣습니다. 이런식으로 트럭대기열이 비고, 다리위에 트럭이 없을 때까지 반복해서 몇 번 반복했는지 카운트를 세면 됩니다. (수정) 다리를 못 건너는 트럭이 있을 수 있어서 체크하는 로직을 추가했습니다. 더불어 각 틱마다 트럭의 위치를 표시하게끔 했습니다. ```{python} def do(): n, w, l = [int(x) for x in input().split()][:3] xs = [int(x) for x in input().split()][:n] if max(xs) > l: print("can't cross the bridge.") bridge = [0] * w elapsed = 0 def show(): print( elapsed, '({:02d})'.format(sum(bridge)), ''.join('[{}]'.format(x if x > 0 else '_') for x in bridge), xs ) show() while xs or sum(bridge) > 0: x = xs[0] if xs else 0 if sum(bridge[1:]) + x <= l: bridge = bridge[1:] + [x] xs = xs[1:] else: bridge = bridge[1:] + [0] elapsed += 1 show() return elapsed do()print(do()) ``` 아래는 결과입니다 ``` 8 4 12 4 2 5 8 6 2 4 9 (00) (00) [_][_][_][_] [4, 2, 5, 8, 6, 2, 4, 9] (01) (04) [_][_][_][4] [2, 5, 8, 6, 2, 4, 9] (02) (06) [_][_][4][2] [5, 8, 6, 2, 4, 9] (03) (11) [_][4][2][5] [8, 6, 2, 4, 9] (04) (11) [4][2][5][_] [8, 6, 2, 4, 9] (05) (07) [2][5][_][_] [8, 6, 2, 4, 9] (06) (05) [5][_][_][_] [8, 6, 2, 4, 9] (07) (08) [_][_][_][8] [6, 2, 4, 9] (08) (08) [_][_][8][_] [6, 2, 4, 9] (09) (08) [_][8][_][_] [6, 2, 4, 9] (10) (08) [8][_][_][_] [6, 2, 4, 9] (11) (06) [_][_][_][6] [2, 4, 9] (12) (08) [_][_][6][2] [4, 9] (13) (12) [_][6][2][4] [9] (14) (12) [6][2][4][_] [9] (15) (06) [2][4][_][_] [9] (16) (04) [4][_][_][_] [9] (17) (09) [_][_][_][9] [] (18) (09) [_][_][9][_] [] (19) (09) [_][9][_][_] [] (20) (09) [9][_][_][_] [] (21) (00) [_][_][_][_] [] 21 ```
다리로 이용할 리스트(길이가 w 이고 0으로 가득찬)를 준비해서 큐로 사용합니다. 다리의 내용을 한 칸 밀고, 남은 무게의 합과 대기열 중 가장 앞 트럭의 무게를 더해서 안전한 수준이면 다리 뒤에 추가합니다. 그렇지 않으면 0을 추가합니다. 대기열에 트럭이 없는 경우에도 다리는 0을 밀어넣습니다. 이런식으로 트럭대기열이 비고, 다리위에 트럭이 없을 때까지 반복해서 몇 번 반복했는지 카운트를 세면 됩니다. (수정) 다리를 못 건너는 트럭이 있을 수 있어서 체크하는 로직을 추가했습니다. 더불어 각 틱마다 트럭의 위치를 표시하게끔 했습니다. ```{python} def do(): n, w, l = [int(x) for x in input().split()][:3] xs = [int(x) for x in input().split()][:n] if max(xs) > l: print("can't cross the bridge.") bridge = [0] * w elapsed = 0 def show(): print( elapsed, '({:02d})'.format(sum(bridge)), ''.join('[{}]'.format(x if x > 0 else '_') for x in bridge), xs ) show() while xs or sum(bridge) > 0: x = xs[0] if xs else 0 if sum(bridge[1:]) + x <= l: bridge = bridge[1:] + [x] xs = xs[1:] else: bridge = bridge[1:] + [0] elapsed += 1 show() return elapsed do()print(do()) ``` 아래는 결과입니다 ``` 8 4 12 4 2 5 8 6 2 4 9 (00) (00) [_][_][_][_] [4, 2, 5, 8, 6, 2, 4, 9] (01) (04) [_][_][_][4] [2, 5, 8, 6, 2, 4, 9] (02) (06) [_][_][4][2] [5, 8, 6, 2, 4, 9] (03) (11) [_][4][2][5] [8, 6, 2, 4, 9] (04) (11) [4][2][5][_] [8, 6, 2, 4, 9] (05) (07) [2][5][_][_] [8, 6, 2, 4, 9] (06) (05) [5][_][_][_] [8, 6, 2, 4, 9] (07) (08) [_][_][_][8] [6, 2, 4, 9] (08) (08) [_][_][8][_] [6, 2, 4, 9] (09) (08) [_][8][_][_] [6, 2, 4, 9] (10) (08) [8][_][_][_] [6, 2, 4, 9] (11) (06) [_][_][_][6] [2, 4, 9] (12) (08) [_][_][6][2] [4, 9] (13) (12) [_][6][2][4] [9] (14) (12) [6][2][4][_] [9] (15) (06) [2][4][_][_] [9] (16) (04) [4][_][_][_] [9] (17) (09) [_][_][_][9] [] (18) (09) [_][_][9][_] [] (19) (09) [_][9][_][_] [] (20) (09) [9][_][_][_] [] (21) (00) [_][_][_][_] [] 21 ```
2 424개 문자 추가 33개 문자 삭제

2016/10/28 03:47

룰루랄라

1 Original

2016/10/28 03:28

룰루랄라

코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.