유블로그

[프로그래머스] 방문길이 Java 본문

알고리즘

[프로그래머스] 방문길이 Java

yujeong kang 2021. 3. 9. 23:10

[프로그래머스] 방문길이 level2 java

 

소요시간 : 28분

 

프로젝트 하느라..

오랜만에 푼 알고... ㅎㅎ

넘 오래걸렸다...

굉장히 쉬운 문제였다.....

 

 

처음에,, 같은 길을 가도 다른 방향에서 오면 새로운 길로 인식해버렸다.. 바보같이...ㅎㅎ

 

어쨌든 내가 푼 방법은!

 

list[0] : 출발행

list[1] : 출발열

list[2] : 도착행

list[3] : 도착열

 

을 저장하고 비교해보는 것~~!

if 내 for 문으로 list를 돌면서

(list[0], list[1]) -> (list[2], list[3])

(list[0], list[1]) -> (list[2], list[3])

 

이렇게 지나간 행적이 없다면 answer에 +1 해줬다!!

 

나는 한 번 움직일 때마다 list를 for문으로 계속 돌기 때문에 비효율적인 코드다....

 

풀고나서 다른 사람들 코드보니 굉장히 다양하더라

 

개인적으로 괜찮다고 생각했던 코드는 set에 string 을 넣어서

a->b, b->a 다 넣었으니

마지막에 set.size()/2 해주는 것..

매우 smart...

 

나도 효율적인 코드를 짤 수 있는 날이 오길...

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int solution(String dirs) {
        int answer = 0;
        char[] DIRS = dirs.toCharArray();
        List<int[]> list = new ArrayList<>();
        int startx = 0, starty = 0;
        int[][] dir = new int[][]{{-1, 0},{1, 0},{0, 1},{0, -1}};
        int curDir = -1;
        for (int i = 0; i < DIRS.length; i++) {
        	switch(DIRS[i]) {
        	case 'U':
        		curDir = 0;
        		break;
        	case 'D':
        		curDir = 1;
        		break;
        	case 'R':
        		curDir = 2;
        		break;
        	case 'L':
        		curDir = 3;
        		break;
        	}
        	if(isInBound(startx+dir[curDir][0], starty+dir[curDir][1])) {
	        	boolean same = false;
	        	for(int[] arr : list) {
	        		if(arr[0] == startx && arr[1] == starty) {
	        			if(arr[2] == startx+dir[curDir][0] && arr[3] == starty+dir[curDir][1]) {
	        				same = true;
	        				break;
	        			}
	        		}
	        		if(arr[0] == startx+dir[curDir][0] && arr[1] == starty+dir[curDir][1]) {
	        			if(arr[2] == startx && arr[3] == starty) {
	        				same = true;
	        				break;
	        			}
	        		}
	        	}
	        	if(!same) {
	        		list.add(new int[]{startx, starty, startx+dir[curDir][0], starty+dir[curDir][1]});
	        		answer++;
	        	}
	        	startx += dir[curDir][0];
	        	starty += dir[curDir][1];
        	}
    		else continue;
        	
		}
        
        return answer;
    }
    boolean isInBound(int x, int y) {
    	if(x > 5 || y > 5 || x < -5 || y < -5)
    		return false;
    	return true;
    }
}