programmers_방문 길이_java

2023. 4. 11. 14:00Algorithm/Programmers

728x90

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;

class Solution {
    
    private static int[][] delta = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}}; // U R D L
    
    public int solution(String dirs) {
        int answer = 0;
        
        Map<String, Integer> visited = new HashMap<>();
        
        int dirsLength = dirs.length();
        
        // 이동
        int y = 0;
        int x = 0;
        for(int i = 0; i<dirsLength; i++){
            int dir = direction(dirs.charAt(i));
            int nexty = y + delta[dir][0];
            int nextx = x + delta[dir][1];
            
            if(isValidPosition(nexty, nextx)){ // 좌표 평면 범위 내 확인                
                StringBuilder sb1 = new StringBuilder();
                StringBuilder sb2 = new StringBuilder();
                
                //y+x+dir 로 키값 설정
                sb1.append(y).append(x).append(dir); 
                sb2.append(nexty).append(nextx).append((dir+2)%4);
                if(!visited.containsKey(sb1.toString()) && !visited.containsKey(sb2.toString())){ // 방문한 적이 없는 경우                   
                    answer++;
                }
                // 2가지 경우가 같은 길 의미하므로 추가
                visited.put(sb1.toString(), 1);
                visited.put(sb2.toString(), 1);
                
                y = nexty;
                x = nextx;
            }
        }
        
        return answer;
    }
    
    public int direction(char dir){
        // 반대 방향 계산시 용이하도록 U R D L 순으로 설정 (+2 시 반대 방향)
        switch(dir){
            case 'U' :
                return 0;
            case 'R' :
                return 1;
            case 'D' :
                return 2;
            case 'L' :
                return 3;
        }
        return 0;
    }
    
    // 좌표평면 경계 유효성 판단
    public boolean isValidPosition(int y, int x){
        if(-5<= y && y<=5 && -5<= x && x<=5){
            return true;
        }
        return false;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

programmers_[3차] 파일명 정렬_java  (0) 2023.04.11
programmers_모음 사전_java  (0) 2023.04.11
programmers_스킬트리_java  (1) 2023.04.10
programmers_땅따먹기_java  (0) 2023.04.10
programmers_주차 요금 계산_java  (0) 2023.04.10