프로그래머스 LV2 - 방문길이

이은엽·2023년 10월 12일
0

문제설명

게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.

  • U: 위쪽으로 한 칸 가기

  • D: 아래쪽으로 한 칸 가기

  • R: 오른쪽으로 한 칸 가기

  • L: 왼쪽으로 한 칸 가기

캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 이루어져 있습니다.

명령어가 매개변수 dirs로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 return 하는 solution 함수를 완성해 주세요.

제한 사항

  • dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
  • dirs의 길이는 500 이하의 자연수입니다.

입출력 예

dirs answer
"ULURRDLLU" 7
"LULLLLLLU" 7

문제풀이

  • 문자에 따라 x,y축 값을 더하고 뺀다.
  • 그 값이 -5이하거나 +5이상이면 신경쓰지 않는다.
  • 이미 방문한 이동구간이면 신경쓰지 않는다.
  • 총 이동거리를 계산한다.

풀이 방법

  • 각각 이동하는 x,y축에 대해서 더하기 및 빼기를 하기 위한 x값 및 y값의 초기값을 0으로 설정
  • 이전과 이후의 이동한 거리를 저장하기 위하여 beforeX및 beforeY를 설정
  • 문자열에 따라 x,y값을 더하기 및 빼기한다.
  • 값이 5이상이거나 5이하면 수행하지 않고 continue
  • 각 값을 일정하게 String타입으로 전환한다.
  • HashSet에 String을 집어넣어 중복된 경우 저장하지 않게 설정
  • 총 HashSet의 값에 대한 Size를 answer로 설정한다.

첫번째 풀이

import java.util.*;
class Solution {
    public int solution(String dirs) {
        int answer = 0;
        int x = 0;
        int y = 0;
        int beforeX = 0;
        int beforeY = 0;
        Set<String> result = new HashSet<>();
        for(int i = 0; i < dirs.length(); i++){
            beforeX = x;
            beforeY = y;
            String position = "";
            if(dirs.charAt(i) == 'U' && x < 5){
                x++;
            }else if(dirs.charAt(i) == 'D' && x > -5){
                x--;
            }else if(dirs.charAt(i) == 'L' && y > -5){
                y--;
            }else if(dirs.charAt(i) == 'R' && y < 5){
                y++;
            }else{
                continue;
            }
            position += x;
            position += y;
            position += beforeX;
            position += beforeY;
            result.add(position);
        }
        answer = result.size();
        return answer;
    }
}
  • 테스트 코드를 수행했을 때 반은 맞지만 반은 틀리는 것을 확인했다.
  • 생각해보니 한 방향이 두번 일어나면 무시하지만
  • 왕복 방향은 무시하지 못하고 저장되는 것을 확인했다.
  • 왕복 방향을 신경쓰도록 했다.

두번째 풀이

import java.util.*;
class Solution {
    public int solution(String dirs) {
        int answer = 0;
        int x = 0;
        int y = 0;
        int beforeX = 0;
        int beforeY = 0;
        Set<String> result = new HashSet<>();
        for(int i = 0; i < dirs.length(); i++){
            beforeX = x;
            beforeY = y;
            String position = "";
            if(dirs.charAt(i) == 'U' && x < 5){
                x++;
                position += x;
                position += y;
                position += beforeX;
                position += beforeY;
            }else if(dirs.charAt(i) == 'D' && x > -5){
                x--;
                position += beforeX;
                position += beforeY;
                position += x;
                position += y;
            }else if(dirs.charAt(i) == 'L' && y > -5){
                y--;
                position += beforeX;
                position += beforeY;
                position += x;
                position += y;
            }else if(dirs.charAt(i) == 'R' && y < 5){
                y++;
                position += x;
                position += y;
                position += beforeX;
                position += beforeY;
            }else{
                continue;
            }
            result.add(position);
        }
        answer = result.size();
        return answer;
    }
}
  • 왕복 방향도 신경쓰기 위해 position의 저장 방식을 일정하게 맞췄다.
  • 그러니까 모두 정답이 나왔다.

배운점

  • 회사 코딩테스트는 전체적인 테스트케이스를 확인할 수 없다.
  • 그러므로 코드를 다 작성하고 조건에 따른 다양한 테스트케이스를 생각해보고 최종 제출을 하자
  • lv2여도 생각보다 쉬웠다.

문제풀이 주소

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

0개의 댓글