티스토리 뷰

반응형

백준 1003번 나무 조각

 

알고리즘 분류: 구현, 시뮬레이션

 

링크: www.acmicpc.net/problem/2947

 

 

2947번: 나무 조각

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

www.acmicpc.net

 

문제

동혁이는 나무 조각을 5개 가지고 있다. 나무 조각에는 1부터 5까지 숫자 중 하나가 쓰여져 있다. 또, 모든 숫자는 다섯 조각 중 하나에만 쓰여 있다.

동혁이는 나무 조각을 다음과 같은 과정을 거쳐서 1, 2, 3, 4, 5 순서로 만들려고 한다.

  1. 첫 번째 조각의 수가 두 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  2. 두 번째 조각의 수가 세 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  3. 세 번째 조각의 수가 네 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  4. 네 번째 조각의 수가 다섯 번째 수보다 크다면, 둘의 위치를 서로 바꾼다.
  5. 만약 순서가 1, 2, 3, 4, 5 순서가 아니라면 1 단계로 다시 간다.

처음 조각의 순서가 주어졌을 때, 위치를 바꿀 때 마다 조각의 순서를 출력하는 프로그램을 작성하시오.

입력

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

출력

두 조각의 순서가 바뀔때 마다 조각의 순서를 출력한다.

 

 

문제 파악

 

간단한 버블 정렬 문제인데 알고리즘 분류가 정렬로 안되어있다.

 

인접한 두 수를 비교해서 큰 수를 뒤로 보내는 식의 정렬 방법이다.

 

리스트에 넣어서 정렬하고 출력할 때는 띄어쓰기로 구분된 문자열로 출력해야 한다.

 

 

코드

# 2947번

tree = list(map(int, input().split()))
answer = [1, 2, 3, 4, 5]

while True:
    for i in range(len(tree)-1):
        if tree[i] > tree[i+1]:
            tree[i], tree[i+1] = tree[i+1], tree[i]
            print(" ".join(map(str, tree)))

    if tree == answer:
        break

이 문제는 파이썬을 사용하면 다른 언어들 보다 더 쉽게 로직을 짤 수 있는것 같다.

 

for문을 통해 버블정렬을 해주고 1, 2, 3, 4, 5 와 같은 순서가 되지 않을시에 이를 다시 반복한다.

 

어떤 a와 b의 값을 바꿀 때 a, b = b, a 라는 파이써닉한 코드를 통해 쉽게 바꿀 수 있다.

 

이렇게 한번 씩 숫자를 바꿀 때 마다 공백으로 구분된 문자열을 출력해야 한다.

 

리스트안에 요소들이 int형이면 join을 통해서 바로 합칠 수 없고 str형으로 변환해서

 

다시 join해야하는데 map을 통해서 이런 번거로움 없이 한번에 str형으로 변환하고 합칠 수 있다.

 

나무 조각의 순서가 1, 2, 3, 4, 5가 되면 break를 통해 while문 까지 종료한다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함