리스트 회전

아래 조건에 따라 리스트를 회전하는 프로그램을 작성하시오.

조건

  • 입력값은 한 행의 문자열로 주어지며, 각 값은 공백으로 구분된다.

  • 첫 번째 값은 리스트를 회전하는 양과 방향(음수의 경우 좌측으로, 양수의 경우 우측으로 회전)이다.

  • 첫 번째 값을 제외한 나머지 값은 리스트의 각 항목의 값이다.

  • 회전된 리스트를 문자열로 출력한다.

  • 구현에 이용할 자료구조에 대한 조건이나 제약은 없다.

  • 입력되는 리스트의 항목의 개수는 유한한다.

입출력예

예 1)

  • 입력: 1 10 20 30 40 50

  • 출력: 50 10 20 30 40

예 2)

  • 입력: 4 가 나 다 라 마 바 사

  • 출력: 라 마 바 사 가 나 다

예 3)

  • 입력: -2 A B C D E F G

  • 출력: C D E F G A B

예 4)

  • 입력: 0 똘기 떵이 호치 새초미

  • 출력: 똘기 떵이 호치 새초미

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

7개의 풀이가 있습니다.

파이썬의 리스트는 음수 인덱스를 지원하기 때문에....

def main(instr):
    l = instr.split(" ")
    a = int(l.pop(0))
    a = a % len(l)
    l = l[-a:] + l[:-a]
    return " ".join(l)

print main("-2 10 20 30 40 50")
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

Ruby

def rotate(s)
  s.split(" ", 2).map{|i|i.split(" ")}.inject{|s, i|i.rotate(-s[0].to_i)}.join(" ")
end

Test

require 'test/unit'
extend Test::Unit::Assertions

assert_equal rotate("1 10 20 30 40 50"), "50 10 20 30 40"
assert_equal rotate("4 가 나 다 라 마 바 사"), "라 마 바 사 가 나 다"   
assert_equal rotate("-2 A B C D E F G"), "C D E F G A B"   
assert_equal rotate("0 똘기 떵이 호치 새초미"), "똘기 떵이 호치 새초미"   
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

루비입니다.

def rotate(str)
  number, *array = str.split(" ")
  number, size = number.to_i, array.size

  case number <=> 0
  when 1
    array = array[-number, number] + array[0, size - number]
  when -1
    array = array[-number, size - number] + array[0, -number]
  end

  array.join(" ")
end

require 'test/unit'
extend Test::Unit::Assertions

assert_equal rotate("0 똘기 떵이 호치 새초미"), "똘기 떵이 호치 새초미"
assert_equal rotate("1 10 20 30 40 50"), "50 10 20 30 40"
assert_equal rotate("4 가 나 다 라 마 바 사"), "라 마 바 사 가 나 다"
assert_equal rotate("-2 A B C D E F G"), "C D E F G A B"
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
    Sub Main()
        Dim src() As String = Split(Console.ReadLine, " ")

        Dim vs As New List(Of String)
        Dim d As Integer = src(0)

        vs.AddRange(src)
        vs.RemoveAt(0) '// 방향 제거

        For i As Integer = 1 To Math.Abs(d)
            If d > 0 Then
                Dim tmp As String = vs.Last
                vs.RemoveAt(vs.Count - 1)
                vs.Insert(0, tmp)
            Else
                Dim tmp As String = vs.First
                vs.RemoveAt(0)
                vs.Add(tmp)
            End If
        Next

        Console.WriteLine(String.Join(" ", vs))

        Console.ReadLine()
    End Sub
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

옛날 생각나서 C로 해봤습니다. 하고나니깐 매우 허접하게 나오내요....

#include<stdio.h>
#include<stdlib.h>

void reversearr(char *arr[], char*chagerarr[], int len, int standard);
int main(void)
{
    char *arr1[] = {"1", "10", "20", "30", "40", "50"};
    char *arr2[] = {"4", "가", "나", "다", "라", "마", "바", "사"};
    char *arr3[] = {"-2", "A", "B", "C", "D", "E", "F", "G"};
    char *arr4[] = {"0", "똘기", "떵이", "호치", "새초미"};

    const int len1 = sizeof(arr1)/sizeof(*arr1);
    const int len2 = sizeof(arr2)/sizeof(*arr2);
    const int len3 = sizeof(arr3)/sizeof(*arr3);
    const int len4 = sizeof(arr4)/sizeof(*arr4);

    char *changearr1[len1];
    char *changearr2[len2];
    char *changearr3[len3];
    char *changearr4[len4];
    int standard1 = 0, standard2 = 0, standard3= 0, standard4= 0, i,j, newstandard = 0;

    standard1 = atoi(arr1[0]);
    standard2 = atoi(arr2[0]);
    standard3 = atoi(arr3[0]);
    standard4 = atoi(arr4[0]);

    reversearr(arr1, changearr1, len1, standard1);
    reversearr(arr2, changearr2, len2, standard2);
    reversearr(arr3, changearr3, len3, standard3);
    reversearr(arr4, changearr4, len4, standard4);

    return 0;
}

void reversearr(char *arr[], char* changerarr[], int len, int standard)
{
    int i,j, newstandard = 0;
    if(standard >=0)
    {
        newstandard = len - standard;
        for(j =0, i=newstandard; i<len; i++, j++)
        {
            changerarr[j] = arr[i];
        }
        for(i = 1; j<len; i++, j++)
        {
            changerarr[j] = arr[i];
        }
        for(i=0; i<len-1; i++)
        {
            printf("%s ", changerarr[i]);
        }
        printf("\n");
    }
    else
    {
        newstandard = standard* -1+1;
        for(j =0, i=newstandard; i<len; i++, j++)
        {
            changerarr[j] = arr[i];
        }
        for(i = 1; j<len; i++, j++)
        {
            changerarr[j] = arr[i];
        }
        for(i=0; i<len-1; i++)
        {
            printf("%s ", changerarr[i]);
        }
        printf("\n");
    }
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

늅늅입니다. 자바로 풀어봤습니다.

public static void main(String args[])
    {
        SotrList("1 10 20 30 40 50");
        SotrList("4 10 20 30 40 50 60 70 80 90 100 110 120 130 140");
        SotrList("7 가 나 다 라 마 바 사 아 자 차 카 타 파 하");
        SotrList("2 A B C D E F G H I J K L M N O P");
    }

    public static void SotrList(String string)
    {
        String tempStr[] = string.split(" ");
        int startIndex = Integer.valueOf(tempStr[0]);

        for(int i = startIndex; i < tempStr.length; i++)
        {
            System.out.print(tempStr[i] + " ");
        }

        for(int i = 1; i < startIndex; i++)
        {
            System.out.print(tempStr[i] + " ");
        }

        System.out.println(" ");
    }

결과는 10 20 30 40 50
40 50 60 70 80 90 100 110 120 130 140 10 20 30
사 아 자 차 카 타 파 하 가 나 다 라 마 바
B C D E F G H I J K L M N O P A
이렇게 나옵니다.

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

링크드 리스트 연습을 위해~

#include <iostream>
#include <stdlib.h>
struct Node {
    int size;
    char* value;
    Node* next;
    Node* prv;
    int t;
};

void addlist(char val[10], int size);
void printnode(Node *node, int revC);

Node* head;
Node* end;
Node* start;
int count = 0;

void main(void) {
    char input[100];
    gets(input);

    int size = 1;
    int revcount = 0;

    start = NULL;
    head = NULL;
    end  = NULL;

    while(input[size]!=NULL) 
        size++;
    revcount = atoi(input);

    char temp[10];
    for(int k = 0; k < 10; k++)
        temp[k] = 0;
    int j = 0;
    for(int i = 2; i< size; i++) {
        if (input[i] != ' '){
            temp[j] = input[i];
            j++;
        }
        if(input[i] == ' ' || input[i+1] == NULL) {
            addlist(temp, j);
            j = 0;
            count++;
            for(int k = 0; k < 10; k++)
                temp[k] = 0;
        }
    }
    start -> next = end;
    end->prv= start;
    printnode(start, revcount);
}
void addlist(char val[10], int size) {

    Node* temp = (Node*)malloc(sizeof(Node) * 10);
    temp->size = size;
    temp->value = (char*) malloc(sizeof(char) * size);
    for(int i =0 ; i<size  ; i++)
        temp->value[i] = val[i];

    temp->next = NULL;
    temp->prv = NULL;

    if(start == NULL) 
        start = temp;

    if (head != NULL) 
        temp->next = head;
    if (end != NULL)
        end->prv = temp;

    head = temp;
    end  = temp;

}

void printnode(Node *node, int revC)
{
    int c= count;
    Node* temp = node;
    if(revC >= 0) {
        while (c > 0)
        {
            c--;
            while(revC >0) {
                temp = temp->next;
                revC--;
            }

            for(int i =0 ; i<temp->size  ; i++)
                printf("%c", temp->value[i]);
            printf(" ");

            if(revC == 0) 
                temp = temp->prv;
        }

    }

    if(revC  < 0) {
        while (c > 0)
        {
            c--;
            while(revC <= 0) {
                temp = temp->prv;
                revC++;
            }

            for(int i =0 ; i<temp->size  ; i++)
                printf("%c", temp->value[i]);
            printf(" ");
            temp = temp->prv;
        }
        printf("\n");
    }

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

풀이 작성

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

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


언어별 풀이 현황
전 체 x 54
python x 28
lisp x 1
기 타 x 7
java x 7
cs x 2
perl x 1
ruby x 1
cpp x 2
objectivec x 1
go x 1
delphi x 1
haskell x 2