아무코딩

[Summer/Winter Coding(~2018)] 방문 길이 (java) 본문

알고리즘/프로그래머스

[Summer/Winter Coding(~2018)] 방문 길이 (java)

동 코 2020. 5. 31. 16:54

문제풀이

 

set 을 이용 하는 데 많은 공부가 되었던 문제이다.

원래 4차원 배열을 이용하여 저장해도 됐지만 set을 사용하고 싶어 사용하다가 자연스레 하나 배워간 문제이다.

 

먼저, set을 사용할때 key가 객체일경우 객체안의 값이아니라 객체자체를 비교하게 된다 그래서 같은객체가 아니라면 값이 같아도 다르게 판단한다.

 

그래서 hashcode를 오버라이딩하여 수정 할 필요가있다. 객체안의 값이 같은경우 같은 해시코드를 반환하게 해주면 객체 값을 가지고 비교할 수 있다.

 

그리고 문제풀 때 주의할점이 방향성이 없는 선이라서 나같은 경우에는 양방향으로 set에 다추가해준 뒤 /2 를 통해 길의 개수를 판단해 주었다.

 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import java.util.HashSet;
import java.util.Set;
 
public class Programmers49994 {
    static Set<Path> pathSet = new HashSet<>();
 
    static int dirRow[] = {-1,0,0,1};
    static int dirCol[] = {0,-1,1,0};
    public static int solution(String dirs) {
        int answer = 0;
        int x = 0;
        int y = 0;
        Path path1 = null;
        Path path2 = null;
        for(int i=0;i<dirs.length();i++){
            int dir = getDir(dirs.charAt(i));
            int nextX = x + dirRow[dir];
            int nextY = y + dirCol[dir];
 
            if(!isRange(nextX, nextY))
                continue;
            path1 = new Path(x,y,nextX,nextY);
            path2 = new Path(nextX,nextY,x,y);
            x = nextX;
            y = nextY;
 
            if(!pathSet.contains(path1)){
                pathSet.add(path1);
                pathSet.add(path2);
            }
        }
        answer = pathSet.size()/2;
        return answer;
    }
 
    public static boolean isRange(int nextX, int nextY) {
        return nextX>=-5&&nextY>=-5 && nextX<=5 &&nextY<=5;
    }
 
    private static int getDir(char c) {
        switch (c){
            case 'U':
                return 0;
            case 'L':
                return 1;
            case 'R':
               return 2;
            case 'D':
                return 3;
            default:
                return -1;
        }
    }
 
    static class Path {
        int curX,curY,nextX,nextY;
 
        public Path(int curX, int curY, int nextX, int nextY) {
            this.curX = curX;
            this.curY = curY;
            this.nextX = nextX;
            this.nextY = nextY;
        }
 
        public void setReverse(){
            int tempX = curX;
            int tempY = curY;
            curX = nextX;
            curY = nextY;
            nextX = tempX;
            nextY = tempY;
        }
 
        public int getCurX() {
            return curX;
        }
 
        public int getCurY() {
            return curY;
        }
 
        public int getNextX() {
            return nextX;
        }
 
        public int getNextY() {
            return nextY;
        }
 
        @Override
        public int hashCode() {
            return Integer.toString(curX).hashCode()+ Integer.toString(curY).hashCode() + Integer.toString(nextX).hashCode()+ Integer.toString(nextY).hashCode();
        }
 
        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Path){
                Path path = (Path) obj;
                return path.getCurX()==curX && path.getCurY() ==curY && path.getNextX() ==nextX && path.getNextY()==nextY;
            }
            return false;
        }
 
 
    }
 
    public static void main(String[] args) {
        String dirs = "ULURRDLLU";
        int result = solution(dirs);
        System.out.println(result);
    }
}
 
cs
 
 

문제 링크 : programmers.co.kr/learn/courses/30/lessons/49994

 

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

 

programmers.co.kr

 

Comments