파이썬 알고리즘 013 | 카드 역배치

Yunny.Log ·2021년 1월 7일
0

Algorithm

목록 보기
13/318
post-thumbnail

13.카드 역배치

1부터 20까지 숫자가 하나씩 쓰인 20장의 카드가 아래 그림과 같이 오름차순으로 한 줄로 놓
여있다. 각 카드의 위치는 카드 위에 적힌 숫자와 같이 1부터 20까지로 나타낸다.

이제 여러분은 다음과 같은 규칙으로 카드의 위치를 바꾼다: 구간 [a, b] (단, 1 ≤ a ≤ b ≤
20)가 주어지면 위치 a부터 위치 b까지의 카드를 현재의 역순으로 놓는다.
예를 들어, 현재 카드가 놓인 순서가 위의 그림과 같고 구간이 [5, 10]으로 주어진다면, 위치
5부터 위치 10까지의 카드 5, 6, 7, 8, 9, 10을 역순으로 하여 10, 9, 8, 7, 6, 5로 놓는다. 이제 전체 카드가 놓인 순서는 아래 그림과 같다.

이 상태에서 구간 [9, 13]이 다시 주어진다면, 위치 9부터 위치 13까지의 카드 6, 5, 11, 12,
13을 역순으로 하여 13, 12, 11, 5, 6으로 놓는다. 이제 전체 카드가 놓인 순서는 아래 그림
과 같다.

오름차순으로 한 줄로 놓여있는 20장의 카드에 대해 10개의 구간이 주어지면, 주어진 구간의
순서대로 위의 규칙에 따라 순서를 뒤집는 작업을 연속해서 처리한 뒤 마지막 카드들의 배치
를 구하는 프로그램을 작성하시오.

▣ 입력설명
총 10개의 줄에 걸쳐 한 줄에 하나씩 10개의 구간이 주어진다. i번째 줄에는 i번째 구간의 시
작 위치 ai와 끝 위치 bi가 차례대로 주어진다. 이때 두 값의 범위는 1 ≤ ai ≤ bi ≤ 20이다.

▣ 출력설명
1부터 20까지 오름차순으로 놓인 카드들에 대해, 입력으로 주어진 10개의 구간 순서대로 뒤집
는 작업을 했을 때 마지막 카드들의 배치를 한 줄에 출력한다.

▣ 입력예제 1
5 10
9 13
1 2
3 4
5 6
1 2
3 4
5 6
1 20
1 20
▣ 출력예제 1
1 2 3 4 10 9 8 7 13 12 11 5 6 14 15 16 17 18 19 20

- 나에게 하는 당부

당연한 거지만 항상 문제를 잘 이해하고 풀기 시작하자..문제를 신중히읽으면 코드도 빠르게 짤 수 있고 더 시간도 절약 - 집에서 할 때 신중하게 읽고 판단하는 습관을 가져야 나중에 시험볼때도 그렇게 할 수 있다

lst=[]       
for i in range(20) :
        lst.append(i+1)
#lst를 만듬(lst=1~20)
for i in range(10):
    a, b=sorted(map(int,input().split()))
    o=[]
#lst[a-1] 부터 lst[b-1]까지 내림차순으로 (sort(reverse=true)) =>이게 아니어따
    for i in range(a-1, b):
        o.append(lst[i])
    o.reverse()
    for i in range(a-1,b):
        lst[i]=o[i+1-a]
print(lst)


#lst[a-1] 부터 lst[b-1] 사이를 reverse

=>문제를 처음에 잘못 이해했었다. 주어진 범위 내에서 크기를 비교해서 내림차순으로 정렬하라는 줄 알았는데, 그게 아니고 그냥 인덱스만 거꾸로 하라는 거였다 크기 비교하는 것 따위는 필요도 없이 말이다ㅠㅠ..
그래서 중간에 메모로 내림차순으로 해야해~이런거 써놨었다가 정정함 허허

<풀이>

이 2부터 7까지의 경우에는
2,7 / 3,6 / 4,5 이렇게 해서 3번 반복해주는 것
즉, 이는 (7-2+1)//2 번 도는 것과 똑같다
이는 (b-a+1)//2 번 도는 것과 same
이런식으로 절반기준으로 나눠서 서로 바꿔주면 되는 것!!
=> 위의 숫자 바꿔주기를 활용해!

a=list(range(21))  =.

for i in range(10) :
    s,e=map(int, input().split())
    for i in range((e-s+1)//2) : 
        a[s+i], a[e-i] = a[e-i], a[s+i]
a.pop(0) 
for i in a:
    print(i, end=' ')

그리고 리스트를 만들때 a=list(range(21))하면
[0,1,2,3,...20]일케 나온다
따라서 0은 나중에 pop해줘야 한다

<반성점>

  • 문제를 잘 읽고 파악하자 제발

<배운 점>

  • 숫자 서로 바꿔주기
    : a, b=map(int,input().split())
    a, b = b, a
    print(a, b)
    =>만약 a, b에 5 10 넣어주면 출력된 결과는 10, 5

여기서 활용된 부분은 인덱스 5,10을 반대인덱스로 나오게 하는거니깐
5-10 =>10-5
6-9 => 9-6
7-8 => 8-7
이렇게 해주는 거니깐
인덱스 a[s+i], a[e-i] = a[e-i], a[s+i] 일케 해주면 된당

<+난 처음에

for i in range(e-s+1//2) : 
        a[s+i-1:e-i-1] = a[e-i-1:s+i-1]

일케 해놓고 있었음

  • for _ in range(n)
    : 그냥 아무 변수 없이 반복하게 된다

  • (n~k)list 생성하기
    : 예를 들어 1,2,3,,,20 까지인 리스트 생성원하면
    a=list(range(21))
    하면 된당 나처럼 굳이 for문 안 사용해도 되고..

=> 리스트를 만들때 a=list(range(21))하면
[0,1,2,3,...20]일케 나온다
따라서 0은 나중에 pop해줘야 한다

0개의 댓글