한 걸음씩

[백준][python] 2947 나무 조각 본문

BOJ

[백준][python] 2947 나무 조각

winter17 2023. 1. 24. 20:56

https://www.acmicpc.net/problem/2947

 

2947번: 나무 조각

첫째 줄에 조각에 쓰여 있는 수가 순서대로 주어진다. 숫자는 1보다 크거나 같고, 5보다 작거나 같으며, 중복되지 않는다. 처음 순서는 1, 2, 3, 4, 5가 아니다.

www.acmicpc.net

풀이 과정 1

1. 5개의 정수를 공백으로 구분해서 입력을 받고

2. 뒷자리의 수가 앞의 자리 수 보다 크다면 자리를 바꾸는데 얼마나 반복해야 하는지 모르니까 while loop

3. range길이는 리스트 내 길이에서 -1

4. swap 함수를 사용해서 앞뒤 숫자 바꿀 수 있음

5. unpacking으로 출력함

6. 입력한 수와 12345가 같다면 break

num = list(map(int, input().split()))
N = [1, 2, 3, 4, 5]
while num != N:
    for i in range(len(num)-1):
        if num[i] > num[i + 1]:
            num[i], num[i + 1] = num[i + 1], num[i]
            print(*num)
    if num == N:
        break

풀이 과정 2

n = list(map(int, input().split()))

cnt = 0
while True:
    if n != [1, 2, 3, 4, 5]:
        if cnt == 4:  # cnt가 4가 되면 index out of range
            if n != [1, 2, 3, 4, 5]: # 다시 보니까 이 부분은 없어도 됨!
                cnt = 0  # 그래서 0으로 초기화
                
        if n[cnt] > n[cnt+1]:  # 앞의 숫자가 더 크면
            n[cnt], n[cnt+1] = n[cnt+1], n[cnt]  # swap
            print(*n)
            
        elif n:
            cnt += 1  # if문의 조건을 만족하지 못했을 때도 cnt수는 증가해야하니까
    else:
        break # n이 [1,2,3,4,5]와 같다면 while문 종료

리뷰

[첫 번째 풀이]

while loop을 사용해야 하고 swap도 하는 걸 알았는데 이걸 어떻게 반복시켜야 하는지 모르겠어서 헤매다가 

다른 사람 코드 참고해 보니까 range에서 len함수로 길이를 세고 -1을 해주면 되는 거였다

 

# 틀린 풀이
import sys
input = sys.stdin.readline
num = list(map(int, input().split()))
N = [1, 2, 3, 4, 5]
while True:
    for i in range(len(num)):
    	if i == 4:
        	i = 0
        if num[i] > num[i+1]:
            num[i], num[i+1] = num[i+1], num[i]
            print(*num)
        if num == N:
            break

[두 번째 풀이]

if문을 3개 만들어서 i가 4가 되면 인덱스 에러 나니까 0으로 초기화시키고

다른 if문에서는 서로 값을 바꾸고 출력하고

또 다른 if문에서는 while 문 종료 시키는 방법으로 코드를 구성했는데 

계속 시간 초과가 나서 sys import 했지만 그것도 아니었다...

 

range의 len 값에서 -1 하면 if문 하나 사라지고

마지막 if문은 for문과 동등한 위치에서 작성해야 하고

가장 중요한 건 while 조건이 True가 아니라 1, 2, 3, 4, 5 리스트 변수 새로 생성해서

서로 다를 경우가 참인 경우로 조건을 만들어 줘야 한다..

 

거의 다 풀었는데 중간중간에 디테일한 부분을 놓쳤다ㅠ

 

[세 번째 풀이]

세 번째 푸는 건데 index out of range 부분을 어떻게 처리할지 고민 많이 함..ㅎ

while문 사용한건 동일한데 이번에는 cnt라는 카운트 변수를 두고 풀었다

매번 풀 때마다 새롭다 ㅎ ㅎ...