[Code Tree - Novice Mid] 04-2. 시뮬레이션 II: 배열 기록

JAVA 문법으로 작성함.

Novice Mid: 05. 시뮬레이션 II

2. 배열 기록

1. 만나는 그 순간

=> A와 B가 동일한 시작점에서 출발하고 1초에 1m씩 움직이며, A, B는 각각 N번, M번에 걸쳐 주어지는 방향으로 특정 시간만큼 이동한다고 할 때, A, B가 움직임을 시작한 이후에 최초로 만나게 되는 시간은 몇 초 뒤인지를 구하는 프로그램

  • 만약 A, B가 움직임을 멈출 때까지 만나지 않는다면 -1을 출력
  • A가 총 이동한 시간과 B가 총 이동한 시간은 항상 동일
  • 처음 A와 B는 서로 다른 방향으로만 움직임

조건: 1 ≤ N, M ≤ 1,000 / 1 ≤ t ≤ 1,000

코드:

import java.util.Scanner;

public class Main {
    private static int findMeetingTime(int[][] moveA, int[][] moveB) {
        int posA = 0, posB = 0; // A, B의 현재 위치
        int timeA = 0, timeB = 0; // A, B의 총 이동시간
        int indexA = 0, indexB = 0; // A, B의 현재 이동 인덱스

        // A, B의 모든 이동을 처리할 때까지 반복
        while (indexA < moveA.length && indexB < moveB.length) {
            // A, B가 같은 위치에 있고 시간이 0보다 크면 만난 것으로 판단
            if (posA == posB && timeA == timeB && timeA > 0) {
                return timeA; // 만난 시간 리턴
            }

            // A의 이동 처리 (B와 같거나 B보다 뒤쳐짐)
            if (timeA <= timeB) {
                posA += moveA[indexA][0]; // 현재 방향으로 이동
                timeA++; // 총 이동 시간 증가
                moveA[indexA][1]--; // 현재 이동의 남은 시간 감소

                // 현재 이동이 끝났으면 다음 이동으로 
                if (moveA[indexA][1] == 0) {
                    indexA++;
                }
            }

            // B의 이동 처리 (A와 같거나 A보다 뒤쳐짐)
            if (timeB <= timeA) {
                posB += moveB[indexB][0]; // 현재 방향으로 이동
                timeB++; // 총 이동 시간 증가
                moveB[indexB][1]--; // 현재 이동의 남은 시간 감소

                // 현재 이동이 끝났으면 다음 이동으로
                if (moveB[indexB][1] == 0) {
                    indexB++;
                }
            }
        }
        // 모든 이동을 처리했지만 만나지 못한 경우
        return -1;   
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int M = sc.nextInt();

        // [N][0]: i번째 이동의 방향, [N][1]: i번째 이동의 시간 
        int[][] moveA = new int[N][2]; 
        int[][] moveB = new int[M][2];

        // A의 이동 입력
        for (int i = 0; i < N; i++) {
            String dir = sc.next();
            int time = sc.nextInt();
            moveA[i][0] = dir.equals("R")? 1 : -1;
            moveA[i][1] = time;
        }

        // B의 이동 입력
        for (int i = 0; i < M; i++) {
            String dir = sc.next();
            int time = sc.nextInt();
            moveB[i][0] = dir.equals("R") ? 1 : -1;
            moveB[i][1] = time;
        }

        int result = findMeetingTime(moveA, moveB);
        System.out.println(result);

        sc.close();
    }
}

입력:

3 4
R 9
L 3
R 5
L 2
R 2
L 1
R 12

출력:

12

2. 벌금은 누구에게

=>

조건:

코드:


입력:


출력:



3. 선두를 지켜라

=>

조건:

코드:


입력:


출력:



4. 좌우로 움직이는 로봇

=>

조건:

코드:


입력:


출력:



5. 악수와 전염병의 상관관계 2

=>

조건:

코드:


입력:


출력:



6. 선두를 지켜라 3

=>

조건:

코드:


입력:


출력:



링크: 코드트리