본문 바로가기
코딩테스트 준비/백준 C#

백준 C# 10812 +) 풀이

by 코딩하는 돼징 2023. 5. 3.
반응형

1. 예제 입력으로 예시

출처 : https://www.acmicpc.net/problem/10812


01 바구니 만들기

N이 10이므로 1부터 N까지 번호가 적혀있는 바구니를 만들어 준다.

int[] array = new int[n];
for(int i = 0; i<n; i++)
{
    array[i] = i;
}


02 w, y, z 입력하기

예시에서 1 6 4로 나와있으므로


2. 바구니 회전시키기

begin, begin+1, ..., mid-1, mid, mid+1, ..., end-1, end -> mid, mid+1, ..., end-1, end, begin, begin+1, ..., mid-1로 회전


01 left - w이전의 값들이다.

Array의 크기는 w-1이다.

int[] left = new int[w - 1];

위의 array에서 0부터 w-1크기만큼 Copy한다.

Array.Copy(array, 0, left, 0, w - 1);

Copy의 결과는 빈 배열이 나온다.


04 leftmid - begin -> mid에서 바뀌는 부분부터 end까지

Array의 크기는 y-z-+1 이다. z가 포함되어야 하므로 z + 1이 된다.

int[] leftmid = new int[y - z + 1];

위의 array에서 z-1 부터 y - z + 1크기만큼 Copy한다.

Array.Copy(array, z - 1, leftmid,0, y - z + 1);

Copy의 결과가 아래의 그림같이 나온다.


05 rightmid - mid -> begin에서 바뀌는 부분부터 mid-1까지

Array의 크기는 z-w 이다.

int[] rightmid = new int[z - w];

위의 array에서 w-1 부터 z - w 크기만큼 Copy한다.

Array.Copy(array, w - 1, rightmid, 0, z - w);

Copy의 결과가 아래의 그림같이 나온다.


06 right - y이후 부터 끝까지

Array의 크기는 array.Length - y 이다.

int[] right = new int[array.Length - y];

위의 array에서 y 부터  array.Length - y  크기만큼 Copy한다.

Array.Copy(array, y , right, 0, array.Length - y);

Copy의 결과가 아래의 그림같이 나온다.

 


07 모든 배열들 concat

Enumerable.Concat()에 대해 알아보기

 

left, leftmid, rightmid, right을 합쳐서 array로 바꿔준다.

array = left.Concat(leftmid).Concat(rightmid).Concat(right).ToArray();

결과적으로 아래와 같은 그림이 나온다.


3. 최종코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace baek2
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            string[] token = input.Split();
            int n = int.Parse(token[0]);
            int m = int.Parse(token[1]);
            
            int[] array = new int[n];
            
            for(int i = 0; i<n; i++)
            {
                array[i] = i;
       
            }
  
            while (m > 0)
            {
                string input2 = Console.ReadLine();
                string[] token2 = input2.Split();
                int w = int.Parse(token2[0]);
                int y = int.Parse(token2[1]);
                int z = int.Parse(token2[2]);
                
                int[] left = new int[w - 1]; 
                int[] leftmid = new int[y - z + 1];
                int[] rightmid = new int[z - w];
                int[] right = new int[array.Length - y];

                Array.Copy(array, 0, left, 0, w - 1);
                Array.Copy(array, z - 1, leftmid,0, y - z + 1);
                Array.Copy(array, w - 1, rightmid, 0, z - w);
                Array.Copy(array, y , right, 0, array.Length - y);
                
                array = left.Concat(leftmid).Concat(rightmid).Concat(right).ToArray();

                m--;
            }
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write($"{array[i] + 1} ");
            }
            Console.WriteLine();
        }
    }
}

 

 

반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# 1157  (0) 2023.05.08
백준 C# 10988  (0) 2023.05.08
백준 C# 2444  (0) 2023.04.28
백준 C# 3003  (0) 2023.04.27
백준 C# 25083  (0) 2023.04.27

댓글