2024.11.19. Today I Learned

polar·2024년 11월 19일

2024년 11월 TIL

목록 보기
17/28
post-thumbnail

1. 오늘 알게 된 내용

금일 애착 유형 검사를 통해 나의 애착 유형에 대해 알게 되었다.

나의 애착 유형은 비밀이다ㅎㅎ

2. 어려웠던 내용

현재 [PCCP 기출문제] 3번 / 충돌위험 찾기 문제를 4시간째 풀고 있다.

해당 문제가 구현 문제이다 보니, 최대한 답안 코드를 보지 않고 하고 있는데, 도대체 어디서 오류가 나는 건지 잘 모르겠다.

3. 궁금한 내용

나를 데려갈 기업이 어딜까 궁금하다.

4. 느낀 점

1. 서류 합격의 기쁨. 그러나 불안감도...

오늘 신입사원 채용 공고와 부트캠프에서 서류 전형 합격 소식을 들었다.

오랜만에 받은 합격 소식이라 그런지, 정말 행복했다.

하지만 확정되지 않은 동아리 일정, 정기적으로 월·수·금요일에 진행해야 하는 일정, SSAFY 면접 준비 등 여러 변수로 인해 불안감도 느낀 하루였다.

2. 경력직... 도전해봐?

오늘 비전공자 대학생의 카카오페이증권 합격 후기를 읽었다.

후기를 보면서 ‘와, 부럽다’는 생각이 드는 한편,

왜 나는 경력 공고에 지원하는것을 망설였을까? 라는 생각을 하게 되었다.

최근 규칙적인 생활을 유지하면서 자신감이 조금씩 올라오고 있는데, CS, Spring Boot, 클라우드 관련 지식을 더 보완한 뒤, 경력직 공고에도 과감히 도전해 봐야겠다고 다짐한 하루였다.


참고 - 코드

/*
 * 프로그래머스 340211번. [PCCP 기출문제] 3번 / 충돌위험 찾기
 * https://school.programmers.co.kr/learn/courses/30/lessons/340211
 */

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;

class Solution {

    /**
     * @param points 운송 포인트 n개의 좌표를 담은 2차원 정수 배열
     * @param routes 로봇 x대의 운송 경로를 담은 2차원 정수 배열 <- 로봇은 첫 포인트에서 시작해 할당된 포인트를 순서대로 방문
     * @return 모든 로봇이 운송을 마칠 때까지 발생하는 위험한 상황의 횟수
     */
    public int solution(int[][] points, int[][] routes) {
        // 입력을 수정한다. (points 배열을 HashMap으로 변환한다.)
        HashMap<Integer, Position> pointMap = new HashMap<>();
        for (int i = 0; i < points.length; i++) {
            pointMap.put(i + 1, new Position(points[i][0], points[i][1]));
        }

        // 로봇이 이동할 경로를 구한다.
        ArrayList<ArrayDeque<Position>> routesList = new ArrayList<>(); // 로봇이 이동할 경로를 담은 리스트
        for (int i = 0; i < routes.length; i++) { // 로봇 x대에 대하여
            routesList.add(getRoute(pointMap, routes[i]));
        }

        // 로봇이 이동할 경로를 순회하며 충돌 위험 상황을 찾는다.
        int answer = 0; // 충돌 위험 상황의 횟수
        boolean isFinished = false; // 모든 로봇이 운송을 마쳤는지 여부

        while (!isFinished) {
            HashMap<String, Integer> visitCountMap = new HashMap<>(); // 현재 좌표에 로봇이 몇 대 있는지를 담은 HashMap (key: "{i 좌표}-{j 좌표}", value: 로봇 대수)

            // 현재 좌표에 로봇이 몇 대 있는지를 구한다.
            for (ArrayDeque<Position> route : routesList) {
                if (!route.isEmpty()) {
                    Position position = route.removeFirst();
                    String key = position.getI() + "-" + position.getJ();
                    visitCountMap.put(key, visitCountMap.getOrDefault(key, 0) + 1);
                }
            }

            // 충돌 위험 상황의 횟수를 구한다.
            for (String key : visitCountMap.keySet()) {
                if (visitCountMap.get(key) > 1) { // 현재 좌표에 로봇이 2대 이상 있는 경우
                    answer++;
                }
            }

            // 모든 로봇이 운송을 마쳤는지 여부를 구한다.
            for (ArrayDeque<Position> route : routesList) {
                if (!route.isEmpty()) { // 아직 운송 중인 로봇이 있는 경우
                    isFinished = false;
                    break;
                }

                isFinished = true;
            }
        }

        return answer;
    }

    /**
     * 로봇이 이동할 경로를 반환하는 메소드
     *
     * @param pointMap 포인트들의 좌표를 담은 HashMap
     * @param routes   로봇이 이동할 포인트를 담은 배열
     * @return 로봇이 이동할 경로
     */
    private ArrayDeque<Position> getRoute(HashMap<Integer, Position> pointMap, int[] routes) {
        ArrayDeque<Position> result = new ArrayDeque<>();

        for (int i = 0; i < routes.length - 1; i++) {
            // from에서 to로 이동하는 최적의 경로를 구한다.
            int from = routes[i]; // 시작 포인트
            int to = routes[i + 1]; // 도착 포인트
            ArrayDeque<Position> route = getRoute(pointMap.get(from), pointMap.get(to)); // from에서 to로 이동하는 최적의 경로

            // route의 경우는 start부터 end까지 이동하는 경로이므로, 첫 좌표는 제외한다. (중복 방지)
            if (i != 0) {
                route.removeFirst();
            }

            // result에 route를 추가한다.
            result.addAll(route);
        }

        return result;
    }

    /**
     * start에서 end로 이동하는 최적의 경로를 반환하는 메소드
     *
     * @param start 시작 좌표
     * @param end   도착 좌표
     * @return start에서 end로 이동하는 최적의 경로
     */
    private ArrayDeque<Position> getRoute(Position start, Position end) {
        ArrayDeque<Position> result = new ArrayDeque<>();

        // 출발 좌표 추가
        result.add(new Position(start.getI(), start.getJ()));

        // 상, 하 이동
        if (start.getI() < end.getI()) {
            for (int i = start.getI() + 1; i < end.getI(); i++) {
                result.add(new Position(i, start.getJ()));
            }
        } else if (start.getI() > end.getI()) {
            for (int i = start.getI() - 1; i > end.getI(); i--) {
                result.add(new Position(i, start.getJ()));
            }
        }

        // 좌, 우 이동
        if (start.getJ() < end.getJ()) {
            for (int j = start.getJ(); j < end.getJ(); j++) {
                result.add(new Position(end.getI(), j));
            }
        } else if (start.getJ() > end.getJ()) {
            for (int j = start.getJ(); j > end.getJ(); j--) {
                result.add(new Position(end.getI(), j));
            }
        }

        // 도착 좌표 추가
        result.add(new Position(end.getI(), end.getJ()));

        return result;
    }

}

class Position {
    private int i;
    private int j;

    public Position(int i, int j) {
        this.i = i;
        this.j = j;
    }

    public int getI() {
        return i;
    }

    public int getJ() {
        return j;
    }
}

0개의 댓글