본문 바로가기
PS/코드트리

[코드트리 챌린지] 3주차 - Simulation (3)

by 행복한라이언 2023. 9. 23.
728x90
반응형

★ 핵심 : 격자 안에서 밀고 당기기

1. temp로 경계값 일시저장 후 오른쪽 또는 왼쪽 밀기 

arr = [1, 2, 3, 4, 5]

n = 5

# 오른쪽으로 밀기(왼쪽에서 밀기)
# Step 1 - 오른쪽 경계값 저장
temp = arr[-1]
# Step 2 - 오른쪽 밀기
for i in range(n - 1, 0, -1):
	arr[i] = arr[i - 1]
# Step 3 
arr[0] = temp # [5, 1, 2, 3, 4]

# 왼쪽으로 밀기(오른쪽에서 밀기)
# Step 1 - 왼쪽 경계값 저장
temp = arr[0]
# Step 2 - 왼쪽으로 밀기
for i in range(n - 1):
	arr[i] = arr[i + 1]
# Step 3
arr[-1] = temp # [2, 3, 4, 5, 1]

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int n = 5;

        // 오른쪽으로 밀기 (왼쪽에서 밀기)
        int temp = arr[n - 1];
        for (int i = n - 1; i > 0; i--) {
            arr[i] = arr[i - 1];
        }
        arr[0] = temp;
        System.out.println(Arrays.toString(arr)); // [5, 1, 2, 3, 4]

        // 왼쪽으로 밀기 (오른쪽에서 밀기)
        temp = arr[0];
        for (int i = 0; i < n - 1; i++) {
            arr[i] = arr[i + 1];
        }
        arr[n - 1] = temp;
        System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]
    }
}

· 문제링크

https://www.codetree.ai/cote/13/problems/conveyor-belt?&utm_source=clipboard&utm_medium=text 

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

· 핵심

1. 컨베이어 벨트 이동시키기

2. d 벨트는 입력과 반대로 들어간다. 입력 받은 값 반대로 만들고 출력할 때 다시 원상복귀 시키기 위해서 또 반대로 해준다.

→ 입력 1 2 3 | 6 5 1 

→ 그림 1 2 3 | 1 5 6

d = list(map(int, input().split()))[::-1]
#...
print(*d[::-1])

· 코드(Python)

n, t = map(int, input().split())

u = list(map(int, input().split()))
d = list(map(int, input().split()))[::-1]

def simulate():
    global u, d
    # Step 1 - u의 가장 오른쪽 숫자 / d의 가장 왼쪽 숫자 저장
    temp_u = u[-1]
    temp_d = d[0]
    # Step 2 - 각 벨트 이동시키기
    # u - 오른쪽으로 벨트 이동시키기 
    for i in range(n - 1, 0, -1):
        u[i] = u[i - 1]
    # d - 왼쪽으로 벨트 이동시키기 
    for i in range(n - 1):
        d[i] = d[i + 1]
    # Step 3 
    # temp_u가 d 벨트의 가장 오른쪽으로 이동
    # temp_d가 u 벨트의 가장 왼쪽으로 이동
    d[-1] = temp_u
    u[0] = temp_d

for _ in range(t):
    simulate()

print(*u)
print(*d[::-1])

· 코드(Java)

import java.io.*;
import java.util.*;

// 시간복잡도 O((t % 2n) * 2n)

public class Main {
    public static int n, t;
    public static final int MAX_N = 200;
    public static int[][] belts = new int[2][MAX_N + 1];

    public static void simulate(){
            // 첫 번째 벨트의 가장 오른쪽 저장
            // 두 번째 벨트의 가장 왼쪽 저장
            int first_belt_temp = belts[0][n - 1];
            int second_belt_temp = belts[1][0];
            // 첫 번째 벨트 오른쪽으로 이동
            for(int i = n - 1; i >= 1; i--){
                belts[0][i] = belts[0][i - 1];
            }
            // 두 번째 벨트 왼쪽으로 이동
            for(int i = 0; i < n - 1; i++){
                belts[1][i] = belts[1][i + 1];
            }
            // 첫 번째 두 번째 벨트 이동 후 저장해놓은 값 기록
            // 첫 번째 벨트의 가장 오른쪽 => 두 번째 벨드의 가장 오른쪽에 저장
            // 두 번째 벨트의 가장 왼쪽 => 첫 번째 벨트의 가장 왼쪽에 저장
            belts[1][n - 1] = first_belt_temp;
            belts[0][0] = second_belt_temp;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        // 다시 돌아오는 주기
        t = Integer.parseInt(st.nextToken());
        t %= (2 * n);

        // 두 번째 벨트는 입력의 반대로 배열이 만들어지며 출력할 때 다시 반대로, 즉 원상복귀시키서 출력해야함.
        for(int r = 0; r < 2; r++){
            st = new StringTokenizer(br.readLine());
            if(r == 0){
                for(int c = 0; c < n; c++){
                    belts[r][c] = Integer.parseInt(st.nextToken());
                }
            }
            else{
                for(int c = n-1; c >= 0; c--){
                    belts[r][c] = Integer.parseInt(st.nextToken());
                }
            }
        }
        // simulate() - 1초 회전 상태를 의미
        for(int i = 0; i < t; i++){
            simulate(); 
        }
        // 출력
        for(int i = 0; i < n; i++){
            System.out.print(belts[0][i] + " ");
        }
        System.out.println();
        for(int i = n - 1; i >= 0; i--){
            System.out.print(belts[1][i] + " ");
        }
    }
}

※ 실력진단

728x90
반응형