본문 바로가기
Algorithm/Programmers

[Programmers/Summer,Winter Coding(2018)] 방문 길이 - Java

by 광진구뚝배기 2021. 8. 9.

알고리즘 문제 풀이 / 프로그래머스 (programmers)  - 방문 길이

 

 

문제 링크

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

 

코딩테스트 연습 - 방문 길이

 

programmers.co.kr

 

 

문제 풀이

 

Math.abs()를 사용하여 좌표평면 안에 값을 체크한다.

x좌표, y좌표를 각각 계산한다.

한 번 지나간 길을 list에 저장한다.

 

 

 

이번 문제는 어떻게 풀어야 할까 생각을 오래 했었다. 머릿속에서 생각을 해보았을 때 조건문을 너무 많이 사용해야 할 것 같아서 계속 고민을 했던 것이었는데 다른 방법이 생각나지 않아 결국 그냥 풀었다. 나중에 시간이 여유로울 때 다시 한번 고민해보고 싶어서 풀고 난 후 에도 다른 사람의 풀이는 보지 않았다. 나중에 풀게 된다면 여기 포스트에 추가 업로드를 하도록 하겠다. 코드를 이해하기 어려울 것 같아서 이번에는 코드에 주석도 달아보았다.

 

내가 생각한 문제 풀이의 핵심은 "방향성을 고려하지 않은 길" 이다. 그래서 나는 한 번 길을 가면 그 길의 반대 방향도 list에 저장했다. 그런 후 다음 방문 때 마다 이미 지나갔던 길이 아니라면 즉, list에 저장 된 값이 아니라면 값을 저장하고, 이미 방문 한 곳이라면 그냥 넘어간다. 또 고려해야할 것은 좌표평면을 벗어나는 것을 체크해줘야 하는데 좌표평면 중점 (0,0)을 기준으로 ±5 이므로 절대값 Math.abs()를 사용했다.

 

public static int solution(String dirs) {
	int x = 0; //x좌표 -> 처음 좌표(0,0)
	int y = 0; //y좌표
	int now_x = x; // 이동한 후 현재 x좌표
	int now_y = y; // 이동한 후 현재 y좌표
	String now = ""; // 현재 명령어
	List<String> list = new ArrayList<String>(); // 이동한 거리 저장 리스트
	String one = ""; // 방향성 때문에 String 변수 두개 생성
	String two = "";

	for(int i = 0; i < dirs.length(); i++) {
		now = String.valueOf(dirs.charAt(i));
		now_x = x; // 좌표평면을 벗어날 경우는 이동하지 않아야하므로 항상 갱신해주는 방법으로 했다.
		now_y = y;

		if(now.equals("D")) { // 수학에서의 좌표 표현 방식대로 처리했다.
			now_y--;
		}else if(now.equals("R")) {
			now_x++;
		}else if(now.equals("U")) {
			now_y++;
		}else if(now.equals("L")) {
			now_x--;
	}
		if(!(Math.abs(now_x) > 5 || Math.abs(now_y) > 5)) { // 좌표평면이 벗어나지 않을 때	
			one = x + "" + y + "" + now_x + "" + now_y; //현재좌표와 이동한 후 좌표 저장
			two = now_x + "" + now_y + "" + x + "" + y;
            
			if( !list.contains(one) ) { // 가지 않은 길 이라면
				list.add(one);
				list.add(two);
			}
			x = now_x; // 이동완료 했으므로 현재 좌표를 바꿔준다.
			y = now_y;
		}
	}

	return list.size()/2; // 방향성 때문에 2개씩 저장 됐으므로 2로 나눠준다.
}
반응형

댓글