일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그래프
- Mendix
- Sort
- 정렬
- Recursion
- 백트래킹
- 자바
- 이분탐색
- 자료구조
- 집합
- lcap
- 재귀
- 알고리즘
- 스택
- 매개변수 탐색
- 트리
- dfs
- git
- algorithm
- 프로그래머스
- Bruteforce
- domain model
- 해시맵
- microflow
- 멘딕스
- 반효경교수님
- 완전탐색
- SQL
- MySQL
- 가중치없는그래프
- Today
- Total
mondegreen
[240325] 알고리즘 리부트 38일차 - 프로그래머스 방문 길이 자바 본문
문제 분석을 진행하면서 배열을 만들까 고민했었다. 논리값 배열을 만들고 지나간 여부를 true / false로 처리하려고 했는데 생각해보니 이 문제는 좌표가 아니라 선분(길, 양 끝의 좌표 세트)을 확인해야 하는 문제였다. 따라서 배열을 사용하지 않고 두 개의 좌표를 필드로 가지고 있는 클래스를 생성해서 그 클래스를 타입으로 하는 해시 셋으로 처리하고자 했다.
하지만 여기서 간과한 것은 내가 클래스의 필드와 생성자만 만들고 set에서 contains로 같다고 확인할 수 있도록 equals 매서드를 만들지 않았기 때문에 각각의 클래스가 new 생성자로 생성된다면 각기 다른 주소값을 가지게 되어 equals로 판별할 수가 없게된다. 그래서 생각한 것은 Set의 타입을 String으로 설정하는 것이다 String 타입의 경우 이미 Object 객체로 부터 equals 매서드를 오버라이딩 해서 주소값이 다르더라도 문자열이 같으면 같다고 판별할 수 있게 구현되어 있기 때문에 가능할 것 같았다. 클래스 대신 각각의 좌표를 문자열 형식으로 만들었고 이를 역전한 값도 set에 넣어주었다. 그렇게 처리하면 set에 같은 선분을 가리키는 두개의 좌표 쌍이 들어있기 때문에 이를 /2 해주면 원하는 값이 나온다.
처음에는 배열로 구현하고자 설계했기 때문에 시작점을 5,5로 설정했는데 배열을 통하지 않고 경계값만 수치로 잘 제어해주면 문제를 풀 수 있기 때문에 -5부터 5까지의 구간으로 처리해도 무방하다. 다른 풀이 코드를 보고 새삼 또 감탄했던 건 나처럼 switch문을 구현하지 않고 명령어의 방향을 map<Character, int[]>에 담아서 각각의 행과 열에 어떤 처리를 할지 처리한 사람이 있었다. 훨씬 코드가 간결하더라 다음에 적용해봐야겠다.
import java.util.*;
class Solution {
public int solution(String dirs) {
char [] comm = dirs.toCharArray();
int startR = 5;
int startC = 5;
int newR = startR;
int newC = startC;
int tmpR, tmpC;
HashSet<String> stepped = new HashSet<>();
for(int i = 0; i < comm.length; i++){
char thisComm = comm[i];
switch(thisComm){
case 'U':
tmpR = newR-1;
tmpC = newC;
if(tmpR<0) continue;
doTheSet(newR, newC, tmpR, tmpC, stepped);
newR = tmpR;
newC = tmpC;
break;
case 'D':
tmpR = newR+1;
tmpC = newC;
if(tmpR>10) continue;
doTheSet(newR, newC, tmpR, tmpC, stepped);
newR = tmpR;
newC = tmpC;
break;
case 'L':
tmpR = newR;
tmpC = newC-1;
if(tmpC<0) continue;
doTheSet(newR, newC, tmpR, tmpC, stepped);
newR = tmpR;
newC = tmpC;
break;
case 'R':
tmpR = newR;
tmpC = newC+1;
if(tmpC>10) continue;
doTheSet(newR, newC, tmpR, tmpC, stepped);
newR = tmpR;
newC = tmpC;
break;
}
}
return stepped.size()/2;
}
public static void doTheSet(int originR, int originC, int tempR, int tempC, HashSet<String> set){
StringBuilder sb = new StringBuilder();
String one = sb.append(originR).append(originC).append(tempR).append(tempC).toString();
sb.setLength(0);
String two = sb.append(tempR).append(tempC).append(originR).append(originC).toString();
set.add(one);
set.add(two);
}
}
'알고리즘 풀이 및 리뷰 > 프로그래머스' 카테고리의 다른 글
[240326] 알고리즘 리부트 39일차 - 프로그래머스 괄호 회전하기 자바 (0) | 2024.03.26 |
---|---|
[240326] 알고리즘 리부트 39일차 - 프로그래머스 올바른 괄호 자바 (0) | 2024.03.26 |
[240324] 알고리즘 리부트 37일차 - 프로그래머스 실패율 자바 (0) | 2024.03.24 |
[240324] 알고리즘 리부트 37일차 - 프로그래머스 행렬의 곱셈 자바 (0) | 2024.03.24 |
[240324] 알고리즘 리부트 37일차 - 프로그래머스 모의고사 자바 (0) | 2024.03.24 |