Engineering Note

카드 역배치(정올 기출) 본문

Problem Solving/파이썬 알고리즘 문제풀이(코딩테스트 대비)

카드 역배치(정올 기출)

Software Engineer Kim 2021. 6. 8. 22:58

it 취업을 위한 알고리즘 문제 풀이

문제

코드

import sys
#sys.stdin = open("input.txt","rt")

card = list(range(21))

for _ in range(10):
    a, b = map(int,input().split())
    for i in range((b-a+1)//2):
        card[a+i], card[b-i] = card[b-i], card[a+i]

card.pop(0)

for x in card:
    print(x,end=" ")

문제해결방법

  • list, range를 이용해 0부터 20 인덱스에 각각 인덱스 값과 같은 숫자 값을 갖는 리스트를 생성
  • 역순으로 바꾸어 주어야 하는 구간 값을 a,b에 입력을 받는다.
  • 그리고 a,b 값이 2와 7일 때 2,7구간의 값을 역순으로 바꾸어 주어야하는데 역순이 되기 위해서는 2인덱스와 7인덱스의 값을 바꾸고, 3 인덱스와 6인덱스의 값을 바꾸고 4인덱스와 5인덱스의 값을 바꾸어 주면된다.
  • 이때 이렇게 바꾸는 행위는 3번 일어나는데 이는 (7-2 + 1)//2 => 3을 통해 구할 수 있다.
  • 만약 a,b값이 3,7로 3인덱스와 7인덱스 4인덱스와 6인덱스 그리고 5인덱스가 짝을 이루지 않을 때에는 2번 바꾸는 행위를 하는데 이때에도 (7-3 + 1)//2 =>2 를 통해 구할 수 있다. 
  • 이를 일반화 하면 (b-a+1)//2로 나타낼 수 있다.
  • 이렇게 바꾸어준 리스트는 0번 인덱스의 0을 포함하고 있고 출력은 1부터 출력하면 되기 때문에 pop함수로 0번 인덱스의 값을 제거해준후 리스트의 각 요소의 값을 출력해주었다.

 

 

'Problem Solving > 파이썬 알고리즘 문제풀이(코딩테스트 대비)' 카테고리의 다른 글

송아지 찾기  (0) 2021.06.15
두 리스트 합치기  (0) 2021.06.09
숫자만 추출  (0) 2021.06.08
회문 문자열 검사  (0) 2021.06.07
점수계산  (0) 2021.06.01
Comments