방문길이
방문길이
- 문제 정리
- 좌표 범위는 -5 <= x,y <= 5
- 방문했던 좌표는 포함하지 않음 Set() 함수 사용
- 어려웠던 점
- 문제에서 요구하는 것은 단순히 “방문한 좌표”가 아니라 “처음 걸어본 길의 길이”
- 범위를 벗어난 경우 같은 자리에 머무르는 경우도 경로에 추가
[!NOTE] 처음 걸어본 길의 길이💡 (0,0) → (0,1) → (-1,1)로 가는 길과, 나중에 (-1,1) → (0,1)로 되돌아가는 길은 같은 길로 취급
- 새롭게 알게된 점
- 문제에서 요구하는 것은 단순히 “방문한 좌표”가 아니라 “처음 걸어본 길의 길이” → “길”과 “좌표”의 차이
// 처음접근 visited.add(`${x},${y}`); // 문제풀이 visitedPath.push(`${x},${y}-${nx},${ny}`); visitedPath.push(`${nx},${ny}-${x},${y}`); return visited.size / 2;
- 문제에서 요구하는 것은 단순히 “방문한 좌표”가 아니라 “처음 걸어본 길의 길이” → “길”과 “좌표”의 차이
- 경계 벗어남으로 인한 “가짜 경로” 생성 → 실제 이동 여부 확인
// ✅ 실제로 이동했을 때만 경로 추가 if (x !== nx || y !== ny) { // 좌표가 실제로 변경되었는지 확인 visitedPath.add(`${x},${y}-${nx},${ny}`); visitedPath.add(`${nx},${ny}-${x},${y}`); }
1차 시도 (약 120분)
// 명령을 입력 받아 좌표를 반환
function location(x, y, dir){
let nx = x;
let ny = y;
if (dir === 'U') {
ny = y + 1;
} else if (dir === 'D') {
ny = y - 1;
} else if (dir === 'R') {
nx = x + 1;
} else if (dir === 'L') {
nx = x - 1;
}
if (nx >= -5 && nx <= 5 && ny >= -5 && ny <= 5) {
return [nx, ny];
} else {
return [x, y];
}
}
let newPos = location(0, 0, 'L');
console.log(newPos.x, newPos.y);
function solution(dirs){
let x = 0;
let y = 0;
const visitedPath = [];
for (const dir of dirs){
const [nx, ny] = location(x, y, dir);
visited.add(`${x},${y}`);
[x, y] = [nx, ny];
}
const visited = new Set(visitedPath);
return visited.size / 2;
}
console.log(solution("ULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLU"));
→ 이동하지 않은 경우도 경로도 카운트가 일어나 27.5와 같은 값도 나타남 → 처음 걸어본 길의 길이 고려하지 못함
2차 시도 (약 120분)
// 명령을 입력 받아 좌표를 반환
function location(x, y, dir){
let nx = x;
let ny = y;
if (dir === 'U') {
ny = y + 1;
} else if (dir === 'D') {
ny = y - 1;
} else if (dir === 'R') {
nx = x + 1;
} else if (dir === 'L') {
nx = x - 1;
}
if (nx >= -5 && nx <= 5 && ny >= -5 && ny <= 5) {
return [nx, ny];
} else {
return [x, y];
}
}
function solution(dirs){
let x = 0;
let y = 0;
const visitedPath = [];
for (const dir of dirs){
const [nx, ny] = location(x, y, dir);
// 현재 좌표와 다음 좌표가 다를 때만 경로를 추가
if (x !== nx || y !== ny) {
visitedPath.push(`${x},${y}-${nx},${ny}`);
visitedPath.push(`${nx},${ny}-${x},${y}`);
[x, y] = [nx, ny];
}
}
const visited = new Set(visitedPath);
return visited.size / 2;
}
console.log(solution("ULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLUULURRDLLU")); // 26
→ 바로 Set에 추가
→ 가독성을 위해 switch case 로 수정
3차 시도 (약 60분) 리팩토링
This line appears after every note.
Notes mentioning this note
There are no notes linking to this note.