본문 바로가기

Code

[python] for, while의 차이에 대한 고민

1. 함수 분석

숫자로 구성된 리스트 자료형에서 앞에 배열된 수보다 작은 수는 앞의 수로 바뀌는 함수를 만듦.

 

1) for - in 반복문으로 각 리스트마다 비교 적용

2) if 문으로 앞의 수와 비교

3) 코드 구성

def sort(unsort_list):
    loop_number = len(unsort_list)

    for compare_index in range(loop_number):

        compare_value = unsort_list[compare_index]
        prev_position = compare_index - 1
        
        while prev_position >= 0 and unsort_list[prev_position] >= compare_value:
            unsort_list[prev_position + 1] = unsort_list[prev_position]
            ## if일 경우 아래 코드 없어도 원하는 결과 나옴. 
            prev_position = prev_position - 1
            
    return unsort_list

test_arr = [5, 3, 1, 6, 7, 13]
sort(test_arr)
print(test_arr)

 


 

2. 문제 분석

 

1) 해당 코드의 역할에 대한 고민에서 문제가 시작됨

prev_position = prev_position - 1

2) if 문에서는 해당 코드 없어도 함수가 의도대로 작동함. 하지만 while 문일 경우 해당 코드가 반드시 필요함

 

 


 

3. for - in 경우의 수 분석

 

1) compare_index = 0

while prev_position >= 0 and unsort_list[prev_position] >= compare_value:

prev_position이 -1이 되므로 while문 종료

 

 

2) compare_index = 1인 경우

while prev_position >= 0 and unsort_list[prev_position] >= compare_value:

prev_position은 0

unsort_list[0] = 5 > unsort_list[1] = 3

조건 충족

 

unsort_list[prev_position + 1] = unsort_list[prev_position]

unsort_list[1] = 5로 변경

 

prev_position = prev_position - 1

prev_position = -1로 변경

 

 

다시 while 반복

while prev_position >= 0 and unsort_list[prev_position] >= compare_value:

prev_postion = -1로 변경 while문 종료

 

 

 

3) compare_index = 2인 경우

while prev_position >= 0 and unsort_list[prev_position] >= compare_value:

prev_position은 1

unsort_list[1] = 5 > unsort_list[2] = 1

조건 충족

 

unsort_list[prev_position + 1] = unsort_list[prev_position]

unsort_list[2] = 5로 변경

 

prev_position = prev_position - 1

prev_postion = 0으로 변경

 

 

다음 while 반복은 어차피 unsort_list의 [0], [1], [2] 값이 다 5로 바뀌었기에 그 다음 while로 반복

 

prev_position = prev_position - 1

prev_position = -1로 변경

 

while문 종료!

 

 

 


 

 

4. 결론

while prev_position >= 0 and unsort_list[prev_position] >= compare_value:

조건 prev_position >=0이 unsort_list[-1] 값과 unsort_list[0] 값을 비교하는 것을 방지하기 위함인 줄 알았으나..

while문을 종료하기 위한 의도로도 쓰였다는 사실을 배움.

 

while 문을 종료하지 않으면 무한 루프이므로 함수가 적용되지 않나보다.