프로그래머스 lv2 방문길이

namkun·2023년 2월 4일
0

코딩테스트

목록 보기
67/79

문제 링크

방문 길이

풀이

  • 해당 문제는 좌표를 방문한 지 확인하는 것이 아니라, 이 경로는 이미 방문한 경로인가? 를 확인하는 문제이다.
  • 그렇기에 경로를 String 으로 만들고, Set에 넣어 중복되는 경로를 없애면 구할 수 있다.
  • (0, 0) -> (0, 1)(0, 1) -> (0, 0)은 결국 방향만 다를 뿐 방문하는 경로 자체는 똑같다.
  • 그렇기에 up과 right는 현재좌표 + 이동좌표, down과 left는 이동좌표 + 현재좌표로 기록할 수 있도록 한다.
    그렇게 한다면 위에서 예를 들었던 것은 모두 0001이 나오고, 이를 통해서 우리는 중복되는 경로를 제거할 수 있게된다.

코드

import java.util.HashSet;
import java.util.Set;

class Solution {
	public int solution(String dirs) {
		int x = 0;
		int y = 0;

		// up, down, right, left
		int[] xPoint = {0, 0, 1, -1};
		int[] yPoint = {1, -1, 0, 0};

		Set<String> MEM = new HashSet<>();

		String[] directions = dirs.split("");
		for (String direction : directions) {
			int move = move(direction);
			int movedX = x + xPoint[move];
			int movedY = y + yPoint[move];

			// 좌표상에서 초과된다면 continue 처리
			if (movedX > 5 || movedX < -5 || movedY > 5 || movedY < -5) {
				continue;
			}

			if(direction.equals("U") || direction.equals("R")){
				MEM.add(String.valueOf(x) + y + movedX + movedY);
			}

			if(direction.equals("D") || direction.equals("L")){
				MEM.add(String.valueOf(movedX) + movedY + x + y);
			}

			x = movedX;
			y = movedY;
		}

		return MEM.size();
	}

	private int move(String direction) {
		switch (direction) {
			case "U":
				return 0;
			case "D":
				return 1;
			case "R":
				return 2;
			case "L":
				return 3;
			default:
				throw new IllegalStateException("Unexpected value: " + direction);
		}
	}
}
profile
개발하는 중국학과 사람

0개의 댓글