Lumpy Space Princess - Adventure Time
코딩테스트/파이썬 알고리즘 문제풀이 입문

[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 카드 역배치

yaebb_82 2023. 4. 26.

*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.

 

 

 

문제

1부터 20까지 숫자가 하나씩 쓰인 20장의 카드가 아래 그림과 같이 오름차순으로 한 줄로 놓여있다. 각 카드의 위치는 카드 위에 적힌 숫자와 같이 1부터 20까지로 나타낸다.
이제 여러분은 다음과 같은 규칙으로 카드의 위치를 바꾼다. 구간 [a,b] (1 <= a <= b <= 20)이 주어지면 위치 a부터 b까지의 카드를 현재의 역순으로 놓는다.
오름차순으로 한 줄로 놓여있는 20장의 카드에 대해 10개의 구간이 주어지면, 주어진 구간의 순서대로 위의 규칙에 따라 순서를 뒤집는 작업을 연속해서 처리한 뒤 마지막 카드들의 배치를 구하는 프로그램을 작성하시오.

 

 

 

풀이

• 답안 : Python

import sys
input = sys.stdin.readline

cards = [i for i in range(21)] # list(range(21)) 도 가능

for _ in range(10):
    a, b = map(int, input().split())

    for i in range((b-a+1) // 2):
        cards[a+i], cards[b-i] = cards[b-i], cards[a+i]

cards.pop(0)

for j in cards:
    print(j, end=' ')

• 답안 : Kotlin (내가 바꿔본 것 / 정확X)

import java.io.*
import java.util.*

fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))){
    var cards = (0..20).toMutableList()

    for(i in 0 until 10) {
        var (a, b) = readLine().split(" ").map{ it.toInt() }

        for(j in 0 until (b-a+1)/2) {
            cards[a+j] = cards[b-j].also { cards[b-j] = cards[a+j] }
        }
    }

    cards.removeAt(0)

    for(k in cards) {
        print("${k} ")
    }
}

- reverse 시키는 방법이 생각이 나지 않아서, 답변을 보고 다시 익히게 되었다.
- 파이썬에서는 swap 방식이 굉장히 쉽다. 하지만 코틀린에서는 파이썬과 같은 방식으로 되지 않아서, 찾아보니 scope 함수를 사용해서 쉽게 구현한다고 한다.

 

 

 

** reverse 로직

→ 인덱스 절반까지만 for문을 돌려서, 앞의 인덱스에는 더해주고 / 뒤의 인덱스에는 빼줘서 서로 swap 시킨다.

 

*** swap 방법

(1) Python

a, b = b, a

(2) Kotlin

a = b.also { b = a }

 

 

 

반응형

댓글