프로그래머스 Summer/Winter Coding(~2018) 방문 길이 [JAVA] - 22년 9월 21일

Denia·2022년 9월 21일
0

코딩테스트 준비

목록 보기
75/201
import java.util.HashSet;
import java.util.Set;

class Solution {
    //사용하는 좌표계의 사이즈를 확인할때 사용
    int mapSizeLimit;
    //이동한 길을 기록해둘 Set
    Set<String> pathMemory;
    //현재 좌표의 위치
    int[] curPoint;
    public int solution(String dirs) {
        //좌표계 사이즈 초기화
        mapSizeLimit = 5;
        //Set 초기화
        pathMemory = new HashSet<>();
        //처음 좌표 시작은 0,0 에서 시작
        curPoint = new int[]{0, 0};

        //제공된 이동경로를 따라 curPoint 를 움직인다.
        for (int i = 0; i < dirs.length(); i++) {
            //움직여야 하는 이동경로
            char command = dirs.charAt(i);
            //주어진 이동경로에 대해서 curPoint 를 이동시키는 메서드
            movePoint(command);
        }

        //이동한 Path 를 가지고 있는 pathMemory 의 Size 절반이 움직인 경로
            //Size의 절반인 이유는 1,1 -> 0,0 간 것 과 0,0 -> 1,1 간 것은 똑같기 때문에 동일 경로에 대해서
            //2가지의 값이 존재한다.
        return pathMemory.size() / 2;
    }

    private void movePoint(char command) {
        //원래 좌표를 저장 : originX, originY
        int originX = curPoint[0];
        int originY = curPoint[1];
        //움직인 좌표를 관리 : moveX, moveY
        int moveX = curPoint[0];
        int moveY = curPoint[1];

        //command에 따라서 다르게 움직이므로 switch문 사용
            //mapSizeLimit 보다 작은 경우에만 좌표를 옮길 수 있음
            //mapSizeLimit 을 넘어가게 되면 더이상 움직이지 못함 => 경로 존재 X , 그러므로 바로 return
        switch (command) {
            case 'U':
                if (moveY + 1 <= mapSizeLimit){
                    moveY++;
                    break;
                }
                return;
            case 'D':
                if (moveY - 1 >= -mapSizeLimit) {
                    moveY--;
                    break;
                }
                return;
            case 'R':
                if (moveX + 1 <= mapSizeLimit) {
                    moveX++;
                    break;
                }
                return;
            case 'L':
                if (moveX - 1 >= -mapSizeLimit) {
                    moveX--;
                    break;
                }
                return;
        }
        
        //움직인 경로를 저장하기 위해서 StringBuilder 객체 생성
        //원래 좌표 , 이동 좌표 를 String 으로 만들어서 pathMemory 에 저장
        StringBuilder tempPathMemory = new StringBuilder();
        tempPathMemory.append(originX).append(originY);
        tempPathMemory.append(moveX).append(moveY);
        pathMemory.add(tempPathMemory.toString());

        //움직인 경로의 반대 버전을 저장하기 위해서 setLength 를 사용하여 StringBuilder 초기화
        //이동 좌표, 원래 좌표 를 String 으로 만들어서 pathMemory 에 저장
        tempPathMemory.setLength(0);
        tempPathMemory.append(moveX).append(moveY);
        tempPathMemory.append(originX).append(originY);
        pathMemory.add(tempPathMemory.toString());

        //현재의 좌표를 움직인 좌표로 수정
        curPoint[0] = moveX;
        curPoint[1] = moveY;
    }
}

profile
HW -> FW -> Web

0개의 댓글