문제
https://school.programmers.co.kr/learn/courses/30/lessons/340211
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 개요
각 로봇은 정해진 경로에 따라 여러 포인트를 순서대로 방문하며, 로봇이 이동하는 과정에서 특정 좌표에서 충돌할 위험이 있을 수 있다. 이 문제의 목표는 모든 로봇이 운송을 마칠 때까지 발생하는 충돌 위험 상황의 횟수를 계산하는 것
접근 방법
- 경로 관리 및 충돌 체크: 로봇들이 이동하는 동안 좌표에서 충돌이 발생하는지 확인해야 한다. 이를 위해 각 시간대에 로봇들이 어떤 좌표에 있는지 추적하고, 동시에 여러 로봇이 같은 좌표에 있을 때 충돌을 감지한다.
- 좌표 이동 로직 구현:
- 각 로봇은 두 좌표 간 최단 경로로 이동합니다. 이때 r 좌표의 변화를 우선으로 하고, 그 후에 c 좌표를 이동
- 각 로봇이 경로의 모든 포인트를 순서대로 방문할 수 있도록 이동을 시뮬레이션
- 충돌 위험 상황 계산: 이동 중 두 대 이상의 로봇이 동일한 좌표에 모이면 충돌 위험이 발생하는데, 이러한 충돌 위험이 발생하는 횟수를 카운트합니다.
해결 과정
- 포인트 및 경로 설정: 주어진 포인트 정보와 로봇 경로를 기반으로 좌표를 설정하고, 각 로봇의 초기 위치와 경로를 관리한다.
- 시뮬레이션: 모든 로봇이 동시에 출발하고, 1초마다 한 칸씩 이동하는 시뮬레이션을 진행한다. 이동할 때마다 각 로봇이 현재 위치를 기록하고, 해당 위치에서 충돌 위험이 있는지 확인한다.
- 최종 계산: 모든 로봇이 운송을 마칠 때까지 충돌 위험 횟수를 계산한 후 반환한다.
import java.util.*;
public class Solution {
public int solution(int[][] points, int[][] routes) {
int answer = 0;
int[][] intArrays = new int[101][101];
List<Robot> list = new ArrayList<>();
for (int i = 0; i < routes.length; i++) {
int index = routes[i][0] - 1;
Pos pos = new Pos(points[index][0], points[index][1]);
Robot robot = new Robot(pos);
intArrays[pos.y][pos.x]++;
for (int j = 1; j < routes[i].length; j++) {
index = routes[i][j] - 1;
pos = new Pos(points[index][0], points[index][1]);
robot.posList.add(pos);
}
list.add(robot);
}
for (int[] row : intArrays) {
for (int val : row) {
if (val > 1) {
answer++;
}
}
}
while (list.size() > 1) {
List<Integer> removeList = new ArrayList<>();
for (int i = list.size() - 1; i >= 0; i--) {
boolean b = list.get(i).movePos(intArrays);
if (!b) {
removeList.add(i);
}
}
for (int idx : removeList) {
list.remove(idx);
}
for (int[] row : intArrays) {
for (int val : row) {
if (val > 1) {
answer++;
}
}
}
}
return answer;
}
public static class Robot {
public Pos pos;
public List<Pos> posList;
public Robot(Pos pos) {
this.pos = pos;
posList = new ArrayList<>();
}
public boolean movePos(int[][] intArrays) {
if (posList.size() > 0 && posList.get(0).y == pos.y && posList.get(0).x == pos.x) {
posList.remove(0);
}
intArrays[pos.y][pos.x]--;
if (posList.size() == 0) {
return false;
}
if (posList.get(0).y != pos.y) {
if (posList.get(0).y > pos.y) {
pos.y++;
} else {
pos.y--;
}
} else if (posList.get(0).x != pos.x) {
if (posList.get(0).x > pos.x) {
pos.x++;
} else {
pos.x--;
}
}
intArrays[pos.y][pos.x]++;
return true;
}
}
public static class Pos {
public int y, x;
public Pos(int y, int x) {
this.y = y;
this.x = x;
}
}
}
'문제 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 최고의 집합 - Java (0) | 2024.10.13 |
---|---|
[프로그래머스] 등굣길 - Java (2) | 2024.10.12 |
[프로그래머스] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 - Java (0) | 2024.09.14 |
[프로그래머스] 두 원 사이의 정수 쌍 - Java (0) | 2024.09.10 |
[프로그래머스] 가장 긴 팰린드롬 - Java (0) | 2024.09.10 |