본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 방문 길이

https://school.programmers.co.kr/learn/courses/30/lessons/49994

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.HashSet;
class Solution {
    public int solution(String dirs) {
        int answer = 0;
        String[] s = dirs.split("");
        float[] coordinate = new float[2]; // coordinate[0] = x , coordinate[1] = y
        HashSet<String> hashSet = new HashSet<>();

        for (String v : s) {
            String st = "";
            float value = 0;

            switch (v) {
                case "U" -> {
                    value = coordinate[1] + 1;
                    if (value > 5) continue;
                    coordinate[1] = coordinate[1] + 1;
                    st = coordinate[0] + String.valueOf(coordinate[1]-0.5);
                }
                case "D" -> {
                    value = coordinate[1] - 1;
                    if (value < -5) continue;
                    coordinate[1] = coordinate[1] - 1;
                    st = coordinate[0] + String.valueOf(coordinate[1]+0.5);
                }
                case "L" -> {
                    value = coordinate[0] - 1;
                    if (value < -5) continue;
                    coordinate[0] = coordinate[0] - 1;
                    st = String.valueOf(coordinate[0]+0.5) + coordinate[1];
                }
                case "R" -> {
                    value = coordinate[0] + 1;
                    if (value > 5) continue;
                    coordinate[0] = coordinate[0] + 1;
                    st = String.valueOf(coordinate[0]-0.5) + coordinate[1];
                }
            }
            hashSet.add(st);
        }
        answer = hashSet.size();
        return answer;
    }
}

0, 0에서 UDLR에 따라 방향을 이동하고 처음 걸어본 길의 길이를 구하는 문제.

좌표평면의 경계는 -5, -5 ~ 5, 5로 되어있다.

각각 UDLR인 경우에 먼저 + 또는 - 하여 계산된 값이 경계를 넘어가는지를 판단하고,

넘어가지 않는 경우에 계산을 해준 뒤, 계산된 값은 지나간 길이 아닌 도착한 점이기 때문에 그 중간 지점이 될 곳을 기록하기 위해 +0.5 또는 -0.5를 하여 이것을 String 형태로 HashSet에 저장하여 중복을 피했다.

이렇게 동작하여 나온 HashSet의 길이가 결국 처음 걸어본 길의 길이가 될 것이므로 이것을 정답으로 제출하여 문제를 해결하였다.

좀 더 간결하게 만들 수 있을 것 같다고 생각했지만, switch를 사용한 시점에서 각 경우에 따라 코드를 작성하다 보니 할 수 없게 되었다.

처음에는 HashSet에 String형태가 아닌 배열을 직접 저장하여 문제를 해결하려고 하였으나, 배열이 저장되면, 그 값이 아닌 주소? 가 저장되어 중복을 해결할 수가 없었다.

다른 방법으로 가능할 수도 있기 때문에 좀 더 HashSet에 대해 공부할 필요가 있어 보인다.