티스토리 뷰

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


1. 문제 내용

 

 

2. 접근 방식

사이클을 한 번 돌리고, 마지막 원소 값이 0인지 확인하는 것이 큰 틀이다.

사이클은 temp 리스트를 생성하여 for문을 돌리는 방식으로 처리한다. 그 이유는 아래와 같다.

li = [1, 2, 3, 4]

for e in li :
  li.append(e)

  if len(li) == 10 : break

print(li) # 결과: [1, 2, 3, 4, 1, 2, 3, 4, 1, 2]

만약 li 라는 리스트에, 다시 1, 2, 3, 4를 집어 넣고 싶다고 가정한다. 위 코드의 문제점은 li 리스트로 반복문을 돌리면서 li 리스트에 원소를 추가하고 있다. 따라서 원소가 끝날 때까지 for문을 돌아야 하는데, 원소가 끊임없이 추가되므로 해당 for문은 무한 루프에 빠지게 된다. 이를 방지하기 위해선 아래 코드처럼 temp 리스트를 사용해야 한다.

li = [1, 2, 3, 4]

temp = [ ]
for e in li :
  temp.append(e)

li.extend(temp)
print(li) # 결과: [1, 2, 3, 4, 1, 2, 3, 4]

이것 때문에 예전에 애를 먹은 적이 있기 때문에 이번에는 이를 미리 명심하고 사이클을 구현하였다.

첫 번째부터 다섯 번째 원소 값에 각각 1, 2, 3, 4, 5를 뺀 값을 temp 리스트에 담고, for문이 끝나면 기존 데이터 리스트에 추가한다. 사이클을 돌기 전 값을 제거하기 위해선 리스트 인덱싱을 사용한다.

 

 

 

3. 정답 코드

def cycle(data) :
    d = 1
    temp = []
    for n in data[0:5] :
        if n - d <= 0 :
            temp.append(0)
            break
            
        temp.append(n-d)
        d += 1
    data.extend(temp)
    return data[ len(temp) : ]

def print_answer(i, data) :
    print(f'#{i}', end= ' ')
    for n in data :
        print(n, end=' ')
    print()

for i in range(10) :
    case = int(input())
    data = list(map(int, input().split()))

    while data[7] != 0 :
        data = cycle(data)

    print_answer(case, data)
728x90