알고리즘 문제 풀이 / 프로그래머스 (programmers) - 방문 길이
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/49994
문제 풀이
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로 나눠준다.
}
반응형
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers/2018 KAKAO BLIND RECRUITMENT] 캐시 - Java (0) | 2021.08.19 |
---|---|
[Programmers/Lv2) 구명보트 - Java (0) | 2021.08.10 |
[Programmers/Lv2] 땅따먹기 - Java (0) | 2021.08.06 |
[Programmers/Lv2] 숫자의 표현 - Java (0) | 2021.07.05 |
[Programmers/Summer,Winter Coding 2018] 스킬트리 - Java (0) | 2021.07.03 |
댓글