카드 역배치(2015년 KOI 지역본선 고등)

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 1

2 2

3 3

4 4

5 5

6 6

7 7

8 8

9 9

10 10

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

출처: 2015 KOI지역본선 고등

1차원 배열
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

22개의 풀이가 있습니다. 1 / 3 Page

cards = range(1,21)
for i in range(10):
    a,b = map(int, raw_input().split())
    cards = cards[:a-1]+list(reversed(cards[a-1:b]))+cards[b:]
print ' '.join([str(x) for x in cards])
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include<cstdio>
int main(){int a,b,c[20],d,i,j,k;for(i=0;i<20;i++)c[i]=i+1;for(i=0;i<10;i++){scanf("%d%d",&a,&b);a--;b--;j=a;k=b;for(;;){d=c[j];c[j]=c[k];c[k]=d;if(j==a+(b-a)/2)break;j++;k--;}}for(i=0;i<20;i++)printf("%d ",c[i]);}
+1 으아아아아아 개행하고싶다아아아아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ - Jung Gyuseok, 2015/11/05 10:04 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
p1 = open( "cardun.text", "r")

aa = []

for i in range(1,20+1):
  aa.append ( i ) 

for line in p1 :
  a,b = map(int, line.split())  
  bb = aa[a-1:b]  
  bb.reverse()
  aa[a-1:b] = bb

print aa
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Python 2.7

a = range(21)
for i in range(10):
    p = map(int, raw_input().split())
    a[p[1]:p[0]-1:-1] = a[p[0]:p[1]+1]
print ' '.join(map(str, a[1:]))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
void exce91()
{
    int a, b;
    int arr[20] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };


    for (int i = 0; i < 10; i++)
    {
        scanf_s("%d %d", &a, &b);

        while (a < b)
        {
            int temp = arr[a - 1];
            arr[a - 1] = arr[b - 1];
            arr[b - 1] = temp;

            a++;
            b--;
        }
    }

    for (int i = 0; i < 20; i++)
        printf("%d ", arr[i]);
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
# -*- coding: cp949 -*-

card_entry = []

for num in range(1, 21):
    card_entry.append(num)

count  = 1

while count < 11:
    print "%d번째 입력" %count
    a = input("a를 입력하시오: ")
    b = input("b를 입력하시오: ")

    if a > b:
        print "a must be equal to or less than b"
        continue
    if a > 20 or b > 20:
        print "Input value must be equal to or less than 20"
        continue

    lst_temp = card_entry[a - 1 : b]
    lst_temp.reverse()
    card_entry[a - 1 : b] = lst_temp

    count += 1


print card_entry
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

C++로 해보았는데 아직 프로그래밍초보라 자신감이 없네요...

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
    char cArray[20], cFor, cSave, cCount; //http://codingdojang.com/scode/486
    int iShift[2];
    for (cFor = 0; cFor < 20; cFor++)
    {
        cArray[cFor] = cFor + 1;
    }
    for (cCount = 1; cCount <= 10; cCount++)
    {
        scanf("%d%d", &iShift[0], &iShift[1]);
        for (cFor = 0; cFor < (iShift[1] - iShift[0]+1)/2; cFor++)
        {
            cSave = cArray[cFor+iShift[0]-1];
            cArray[iShift[0] + cFor-1] = cArray[iShift[1] - cFor-1];
            cArray[iShift[1] - cFor-1] = cSave;
        }
    }
    for (cFor = 0; cFor <= 19; cFor++)
    {
        printf("%2d ", cArray[cFor]);
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
prev = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
start = []
end = []
for i in range(10):
    a = input()
    token = a.split()
    start.append(int(token[0])-1)
    end.append(int(token[1]))


for i in range(len(start)):
    a = start[i]
    b = end[i]
    x = prev[:a]
    y = prev[a:b]
    z = prev[b:]
    y.reverse()
    prev = x + y + z

print(prev)

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
    Sub Main()
        Dim oArr() As Integer = Enumerable.Range(1, 20).ToArray

        For k As Integer = 1 To 10
            Dim input As String = Console.ReadLine

            Dim n As Integer = input.Split(" ")(0) - 1
            Dim m As Integer = input.Split(" ")(1) - 1

            For j As Integer = n To n + (m - n) / 2
                Dim tmp As Integer = oArr(j)
                oArr(j) = oArr(m - (j - n))
                oArr(m - (j - n)) = tmp
            Next
        Next

        Console.WriteLine(String.Join(" ", oArr))
    End Sub

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
card = list(range(1,21))

for i in range(10):
    partial_range = input('Enter a, b (1<= a < b <=20): ').split()
    a, b = int(partial_range[0]), int(partial_range[1])
    if a == 1:
        card[a-1:b] = card[b-1::-1]
    else:
        card[a-1:b] = card[b-1:a-2:-1]
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.

1차원 배열 x 1

언어별 풀이 현황
전 체 x 22
python x 12
cs x 1
기 타 x 3
cpp x 4
php x 1
ruby x 1