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

2022. 4. 1. 18:24·프로그래머스/Level 2

문제

문제가 길어서 링크로 대체

https://programmers.co.kr/learn/courses/30/lessons/49994?language=java 

 

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

 

programmers.co.kr

 

 

내 풀이코드

static boolean[][][][] map = new boolean[11][11][11][11];   //경로를 지나갔는지 판별할 배열 설정
static int cx = 5, cy = 5;                                  //현재의 x,y좌표
static int nx = 5, ny = 5;                                  //다음에 이동할 x,y좌표
public int solution(String dirs) {
    int answer = 0;                                         //경로의 수
    for(char x : dirs.toCharArray()){
        cx = nx;                                            //현재의 x,y좌표에 다음에 이동할 x,y좌표를 넣는다.
        cy = ny;
        if(x == 'U'){                                       //들어온 문자에 따라서 x,y좌표를 다르게 이동한다.
            ny += 1;
        }else if(x == 'D'){
            ny -= 1;
        }else if(x == 'R'){
            nx += 1;
        }else{
            nx -= 1;
        }
        if(nx > 10 || nx < 0 || ny > 10 || ny < 0){         //다음에 이동할 x,y좌표가 주어진 좌표를 넘을 시
            nx = cx;                                        //다시 좌표를 그 전 좌표로 바꾼다.
            ny = cy;
        }else{                                              //주어진 좌표값을 넘어가지 않을 시,
            if(!map[cx][cy][nx][ny]){                       //만약 경로가 처음가는 경로이면
                map[cx][cy][nx][ny] = true;                 //왕복경로를 모두 true로 바꾸고 경로의 수에 +1을 해준다.
                map[nx][ny][cx][cy] = true;
                answer++;
            }
        }
    }

    return answer;
}

솔직히 처음에는 지나간 경로를 표시할 방법이 생각나지 않아서 따로 좌표를 나타내는 Class를 만들어서 풀어야하나....?라고 생각했지만 다시 생각해보니 주어진 좌표로 가는 경로의 수를 체크하는 것도 아니고 단순히 움직인 경로만 체크하면 되니까 그냥 boolean 4차원 배열로 지나간 경로를 체크하면 될 것 같아서 그렇게 풀었다.

 

근데 solution메서드 안에 boolean 배열을 선언하면 이 문제는 괜찮지만 혹시 다른 문제를 풀때에는 solution 메서드를 불러올때마다 다시 선언이 되니까 그냥 밖에다가 static의 형태로 선언을 했다.

 

그리고 문제에는 기존의 좌표가 (0,0)이고 x,y의 범위가 -5~5였지만 배열에서는 index값을 -로 나타낼 수 없어서 그냥 모든 좌표값에 +5를 하여서 x,y의 최소값을 0으로 만들고 기존의 좌표를 (5,5)로 두고 시작했다. 

 

한가지 조심해야 할 점은

if(!map[cx][cy][nx][ny]){                       //만약 경로가 처음가는 경로이면
    map[cx][cy][nx][ny] = true;                 //왕복경로를 모두 true로 바꾸고 경로의 수에 +1을 해준다.
    map[nx][ny][cx][cy] = true;
    answer++;
}

이 부분에서 map[][][][]을 2개 다 true로 해줘야 되는데 그 이유는

예를 들어, (0,0) -> (1,1) 이렇게 가는 경로나 (1,1) -> (0,0) 이렇게 가는 경로나 지나간 경로는 똑같이 때문이다.

나머지 부분들은 쉬워서 주석에 적어놓은 말로도 이해가 가능할 것이다.

저작자표시 비영리 (새창열림)

'프로그래머스 > Level 2' 카테고리의 다른 글

[프로그래머스][Level2][Java] n^2배열 자르기  (0) 2022.04.04
[프로그래머스][Level2][Java] 스킬트리  (0) 2022.04.01
[프로그래머스][Level2][Java] 가장 큰 수  (0) 2022.03.25
[프로그래머스][Level2][Java] 타겟 넘버  (0) 2022.03.25
[프로그래머스][Level2][Java] 더 맵게  (0) 2022.03.23
'프로그래머스/Level 2' 카테고리의 다른 글
  • [프로그래머스][Level2][Java] n^2배열 자르기
  • [프로그래머스][Level2][Java] 스킬트리
  • [프로그래머스][Level2][Java] 가장 큰 수
  • [프로그래머스][Level2][Java] 타겟 넘버
BvrPark
BvrPark
코드 퍼즐과 개발 일상
  • BvrPark
    비버의 개발 일지
    BvrPark
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • JAVA (7)
        • 메서드 외울 것 (2)
      • 프로그래머스 (56)
        • 총 풀이 코드(깃허브) (1)
        • Level 1 (22)
        • Level 2 (33)
      • 백준 알고리즘(단계 별) (16)
        • 총 풀이 코드(깃허브) (1)
        • 1. 입출력과 사칙연산 (2)
        • 2. if 문 (2)
        • 3. for문 (1)
        • 4. while문 (2)
        • 5. 1차원 배열 (3)
        • 6. 함수 (1)
        • 7. 문자열 (1)
        • 8. 기본수학 1 (3)
      • 백준 알고리즘(solved.ac) (9)
        • 총 풀이 코드(깃허브) (1)
        • class2 (8)
      • LeetCode 문제 풀이 (4)
        • 총 풀이 코드(깃허브) (1)
        • Easy (3)
      • 코드업 알고리즘 (7)
      • git과 github사용법 (4)
      • html, css, javaScript (2)
      • 프로젝트 (11)
        • 순수 Java 프로젝트 (2)
        • 쇼핑몰 프로젝트 (2)
        • 게시판 프로젝트 (5)
        • 근태관리 프로젝트 (2)
      • 커피타임 (2)
        • 2023년 (2)
        • 2024년 (0)
  • 블로그 메뉴

    • 링크

      • 포트폴리오
      • 깃허브
    • 공지사항

    • 인기 글

    • 태그

    • 최근 댓글

    • 최근 글

    • Designed By정상우
    BvrPark
    [프로그래머스][Level2][Java] 방문 길이
    상단으로

    티스토리툴바