[문제링크]

package org.pack.feb_3.Lv1_공원산책;

import java.util.HashMap;
import java.util.Map;

public class chooi {
    public int[] solution(String[] park, String[] routes) {
        // 시작 위치 찾기
        int startX = 0, startY = 0;
        for(int i = 0; i < park.length; i++) {
            for(int j = 0; j < park[i].length(); j++) {
                if(park[i].charAt(j) == 'S') {
                    startX = i;
                    startY = j;
                }
            }
        }

        // 방향 이동 정의
        Map<String, int[]> directions = new HashMap<>();
        directions.put("N", new int[]{-1, 0});
        directions.put("S", new int[]{1, 0});
        directions.put("W", new int[]{0, -1});
        directions.put("E", new int[]{0, 1});

        // 명령 수행
        for(String route : routes) {
            String[] split = route.split(" ");
            String dir = split[0];      // 방향
            int steps = Integer.parseInt(split[1]);     // 이동거리
            int[] move = directions.get(dir);       // 방향 이동 값 가져오기

            int newX = startX, newY = startY;
            boolean canMove = true;

            for(int i = 1; i <= steps; i++) {
                int nextX = startX + move[0] * i;
                int nextY = startY + move[1] * i;

                // 공원을 벗어나면 중단
                if(nextX < 0 || nextX >= park.length || nextY < 0 || nextY >= park[0].length()) {
                    canMove = false;
                    break;
                }

                // 장애물(X)이 있으면 중단
                if(park[nextX].charAt(nextY) == 'X') {
                    canMove = false;
                    break;
                }

                // 이동 가능하면 최종 위치 저장
                newX = nextX;
                newY = nextY;
            }

            // 이동이 가능하다면 위치 업데이트
            if(canMove) {
                startX = newX;
                startY = newY;
            }
        }
        return new int[]{startX, startY};
    }
}

'Java기반FullStack > CoTe' 카테고리의 다른 글

코딩 테스트 하기 전 필수 개념?  (1) 2025.03.03

코딩테스트를 준비하는 과정에서 배열(Array), 리스트(List), 맵(Map) 이라는 자료구조를 반드시 이해하고 활용할 수 있어야 합니다. 이 세 가지 자료구조는 대부분의 코딩테스트 문제를 해결하는 데 필수적으로 사용되며, 활용 방법을 모르면 문제를 풀 수 없는 경우가 많습니다.


 

1️⃣ 배열(Array) - 가장 기본적인 데이터 구조

📌 배열이란?

배열(Array)은 고정된 크기의 동일한 타입의 데이터를 연속적으로 저장하는 자료구조입니다.

✔ 언제 사용할까?

  • 정해진 개수의 데이터를 저장해야 할 때

         → n개의 숫자가 주어집니다 라고 문제에서 주어진 경우.

 

  • 인덱스를 사용해 빠르게 접근해야 할 때

          → O(1) 시간 복잡도로 데이터를 조회 가능.

 

  • 데이터의 추가/삭제가 빈번하지 않을 때

          → 배열의 크기를 변경하는 것이 어렵기 때문.

 

💡 배열을 활용한 예제 (Java)

// 크기가 5인 정수형 배열 선언
int[] numbers = new int[5];

// 배열 초기화
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
numbers[3] = 40;
numbers[4] = 50;

// 배열 값 출력
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

➡️ 배열은 인덱스를 활용해 빠르게 데이터를 조회할 수 있지만 크기 변경이 어렵고 삽입/삭제가 어렵다는 단점이 있음.


 

2️⃣ 리스트(List) - 크기 가변적인 배열

📌 리스트란?

리스트(List)는 배열과 달리 크기가 동적으로 변하는 자료구조입니다.

즉, 데이터를 추가/삭제하는 것이 용이합니다.

✔ 언제 사용할까?

  • 데이터의 개수가 가변적일 때

→ 문제에서 입력 개수가 정해지지 않았다면 리스트가 필요.

  • 중간에 데이터를 추가/삭제해야 할 때

→ 배열과 다르게 크기를 유동적으로 변경 가능.

  • 배열보다 편리한 기능을 활용하고 싶을 때

→ 예를 들어, 정렬이나 특정 값 검색 등.

💡 리스트를 활용한 예제 (Java)

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(); // 리스트 선언

        // 값 추가
        list.add(10);
        list.add(20);
        list.add(30);

        // 값 삭제
        list.remove(1); // 인덱스 1의 값 삭제

        // 값 출력
        for (int num : list) {
            System.out.println(num);
        }
    }
}

➡️ 리스트는 배열보다 유동적인 크기 조절이 가능하고 삽입/삭제가 용이한 장점이 있지만

인덱스 조회 성능은 배열보다 약간 떨어짐.


3️⃣ 맵(Map) - 키(Key)와 값(Value)으로 데이터 저장

📌 맵이란?

맵(Map)은 키(Key)와 값(Value) 형태로 데이터를 저장하는 자료구조입니다.

배열이나 리스트는 인덱스를 사용해 접근하지만 맵은 키를 통해 특정한 값을 빠르게 찾을 수 있음.

✔ 언제 사용할까?

  • 빠른 검색이 필요할 때

→ 키를 통해 O(1) 또는 O(logN)의 속도로 데이터를 조회 가능.

  • 데이터를 (Key, Value) 형태로 저장해야 할 때

→ 예를 들어, 학생의 성적을 저장할 때 {"홍길동": 90, "이순신": 85}.

  • 데이터 중복을 방지해야 할 때

→ 중복된 키를 허용하지 않음.

💡 맵을 활용한 예제 (Java)

import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>(); // 맵 선언

        // 값 추가
        map.put("apple", 3);
        map.put("banana", 5);
        map.put("cherry", 7);

        // 값 조회
        System.out.println(map.get("banana")); // 5 출력

        // 값 삭제
        map.remove("apple");

        // 모든 키와 값 출력
        for (String key : map.keySet()) {
            System.out.println(key + " : " + map.get(key));
        }
    }
}

➡️ 맵은 빠른 데이터 조회가 가능하지만 데이터가 순서대로 저장되지 않는 특징이 있음.


🎯 결론: 코딩테스트에서 자료구조 선택 기준!

자료구조
언제 사용할까?
주요 특징
배열(Array)
정해진 개수의 데이터를 저장할 때
빠른 접근, 고정 크기
리스트(List)
데이터 개수가 유동적일 때
크기 조절 가능, 삽입/삭제 용이
맵(Map)
빠른 검색이 필요할 때
키-값 저장, 중복 키 없음

배열(Array): 고정된 크기의 데이터를 다룰 때 사용. 빠른 인덱스 조회가 강점.

리스트(List): 데이터의 개수가 가변적이고 삽입/삭제가 필요할 때 사용.

맵(Map): 특정 키로 값을 빠르게 찾을 때 유용. 검색 성능이 뛰어남.

📌 코딩테스트에서 가장 많이 활용되는 자료구조는 리스트(List)와 맵(Map)이다!

배열은 고정 크기의 데이터에 유용하지만 리스트는 더 유연한 데이터를 다룰 때 필수적

맵을 알면 검색과 데이터 관리가 훨씬 쉬워진다

'Java기반FullStack > CoTe' 카테고리의 다른 글

[프로그래머스/Java] 공원산책  (0) 2025.03.05

+ Recent posts