Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C++
- JavaScript
- programmers
- SW
- java
- json-server
- createSlice
- Python
- redux-saga
- react
- maeil-mail
- react-redux
- redux
- react-router
- 자바
- sw expert academy
- 프로그래머스
- 항해플러스
- axios
- Get
- redux-toolkit
- 이코테
- 매일메일
- 알고리즘
- 코딩테스트합격자되기
- 테코테코
- Algorithm
- 항해99
- 리액트
- useDispatch
Archives
- Today
- Total
Binary Journey
[코딩테스트합격자되기-자바편] 문제07. 방문길이 본문
반응형
💡 해당 풀이는 코딩 테스트 합격자되기 - 자바편 에서 발췌된 내용을 바탕으로 작성되었습니다.
문제
출처: 프로그래머스 - 방문길이
내용
게임 캐릭터를 4가지 명령어를 통해 움직이려 합니다. 명령어는 다음과 같습니다.
- U: 위쪽으로 한 칸 가기
- D: 아래쪽으로 한 칸 가기
- R: 오른쪽으로 한 칸 가기
- L: 왼쪽으로 한 칸 가기
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 구성합니다.
명령어가 매개변수 dirs
로 주어질 때, 게임 캐릭터가 처음 걸어본 길의 길이를 구하여 반환하는 solution()
함수를 완성해 주세요.
제약 조건
- dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
- dirs의 길이는 500 이하의 자연수입니다.
입출력의 예
dirs | answer |
---|---|
ULURRDLLU | 7 |
LULLLLLLU | 7 |
풀이
풀이 시간
시작 시각 | 종료 시각 | 총 소요 시간 |
---|---|---|
15:56 | 16:42 | 48분 |
문제 분석
- U: 위쪽으로 한 칸 가기 -> (0, 1)
- D: 아래쪽으로 한 칸 가기 -> (0, -1)
- R: 오른쪽으로 한 칸 가기 -> (1, 0)
- L: 왼쪽으로 한 칸 가기 -> (-1, 0)
캐릭터는 좌표평면의 (0, 0) 위치에서 시작합니다. 좌표평면의 경계는 왼쪽 위(-5, 5), 왼쪽 아래(-5, -5), 오른쪽 위(5, 5), 오른쪽 아래(5, -5)로 구성
제약 사항 파악 & 테스트 케이스 작성
- dirs는 string형으로 주어지며, 'U', 'D', 'R', 'L' 이외에 문자는 주어지지 않습니다.
- dirs의 길이는 500 이하의 자연수입니다.
입력값 분석
💡 입력값을 분석하면 문제에서 요구하는 알고리즘의 시간 복잡도를 간접적으로 파악할 수 있습니다.
dirs | answer |
---|---|
ULURRDLLU | 7 |
LULLLLLLU | 7 |
의사 코드 작성
💡 의사 코드는 동작 중심으로 작성하는 것이 중요합니다.
💡 의사 코드는 문제 해결 순서로 작성합니다.
💡 의사 코드를 충분히 테스트해봅니다.
int solution(String dirs) {
// direction
// U = (0, 1)
// D = (0, -1)
// R = (1, 0)
// L = (-1, 0)
// edge (-5, 5), (-5, -5), (5, -5), (5, 5)
// start = (0, 0)
int answer = 0;
// 1. char 쪼개기
for (dir in dirs) {
// 1. next = prev + direction
// 2. 0보다 작을 경우 max(-5), 0보다 클 경우 min(5)
// next != prev 일 경우 answer++
}
return answer;
}
구현
import java.util.HashMap;
import java.util.HashSet;
class Solution {
public int solution(String dirs) {
// direction
HashMap<Character, int[]> directions = new HashMap<>();
directions.put('U', new int[]{0, 1});
directions.put('D', new int[]{0, -1});
directions.put('R', new int[]{1, 0});
directions.put('L', new int[]{-1, 0});
int max = 10;
int min = 0;
int prevX = 5;
int prevY = 5;
HashSet<String> answer = new HashSet<>();
// 1. for 문
for (int i = 0; i < dirs.length(); i++) {
// 1. next = prev + direction
char dir = dirs.charAt(i);
int[] direction = directions.get(dir);
int nextX = prevX + direction[0];
int nextY = prevY + direction[1];
// 2. 0보다 작을 경우 혹은 10보다 클 경우 continue
if (nextX > max || nextX < min || nextY > max || nextY < min) {
continue;
}
// 3. 방문 업데이트
// a -> b 인 경우 b -> a 와 동일하게 방문된 곳이므로 추가되어야 함
answer.add(prevX + " " + prevY + " " + nextX + " " + nextY);
answer.add(nextX + " " + nextY + " " + prevX + " " + prevY);
// 4. 좌표 업데이트
prevX = nextX;
prevY = nextY;
}
return answer.size() / 2;
}
}
복기하기
저자 권장 시간 | 권장 시간 복잡도 |
---|---|
40분 | O(N) |
답안과 나의 풀이를 비교해보세요
- 원점 옮기는 것도 고려해 보기
- 쉽게 생각하기
- 중복되는 경우가 존재하고 답에서 중복된 값을 제거해야 한다면 HashSet 사용 생각해보기
요약하기
- 시간복잡도 O(N)
반응형
'Algorithm > 코딩테스트합격자되기-자바편' 카테고리의 다른 글
[코딩테스트합격자되기-자바편] 문제09. 10진수를 2진수로 변환하기 (0) | 2025.01.04 |
---|---|
[코딩테스트합격자되기-자바편] 문제08. 올바른 괄호 (0) | 2025.01.04 |
[코딩테스트합격자되기-자바편] 문제06. 실패율 (2) | 2024.12.26 |
[코딩테스트합격자되기-자바편] 문제05. 행렬의 곱셈 (0) | 2024.12.26 |
[코딩테스트합격자되기-자바편] 문제04. 모의고사 (1) | 2024.12.26 |