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 | 29 | 30 |
Tags
- 너비우선탐색
- programmers
- BFS
- 깊이우선탐색
- 구현
- DynamicProgramming
- Network
- 백트래킹
- 해시맵
- 동적계획법
- dynamic programming
- 알고리즘
- 네트워크
- 그리디
- 스프링
- 브루트포스
- boj
- 백준
- greedy
- Spring
- 프로그래머스
- 해시
- broadcast
- DFS
- 이분탐색
- HashMap
- DP
- switch
- Algorithm
- Backtracking
Archives
- Today
- Total
옌의 로그
[Algorithm] 프로그래머스 - 표 편집 본문
문제
[프로그래머스] 표 편집
(2021 카카오 채용연계형 인턴쉽)
사용 알고리즘
- 연결리스트 (Linked List)
해결방법

- 표의 각 행 정보를 저장하는 Node를 만들고, 해당 노드들을 가지고 linked list를 생성한다
- Node는 행의 index, 해당 행 이전 행의 index(prev), 다음 행의 index(next)를 갖는다.
- moveSelectedNode (count, direction) : 명령어 U, D 사용
- direction (prev, next) 방향으로 count 만큼 이동하여 select 된 Node를 변경
- deleteNode : 명령어 C 사용
- 현재 select된 Node를 cStack에 따로 저장 후
- 해당 Node의 prevNode의 next, 해당 Node의 nextNode의 prev를 갱신
- recoverNode : 명령어 Z 사용
- delete와 반대로 삭제되어 cStack에 분리보관됐던 노드를 원복시킴
- 최근에 삭제된 것 부터 순서대로 원복이며, 해당 노드의 prevNode의 next, 해당 Node의 nextNode의 prev를 갱신
소스코드
사용언어 : Javascript
function solution(n, k, cmd) {
const Node = function (index, prev) {
this.index = index;
this.prev = prev;
this.next = null;
};
let prevNode = new Node(0);
let select; //선택된 노드
// 링크드리스트 생성
for (let i = 1; i < n; i++) {
const cntNode = new Node(i, prevNode);
prevNode.next = cntNode;
prevNode = cntNode;
// 처음 선택된 노드 저장
if (i === k) {
select = cntNode;
}
}
let cStack = [];
const moveSelectedNode = (count, direction) => {
for (let i = 0; i < count; i++) {
if (!select[direction]) break;
select = select[direction];
}
};
const deleteNode = () => {
const prev = select.prev;
const next = select.next;
cStack.push(select);
select = next ? next : prev;
if (prev) prev.next = next;
if (next) next.prev = prev;
};
const recoverNode = () => {
const targetNode = cStack.pop();
const prev = targetNode.prev;
const next = targetNode.next;
if (prev) prev.next = targetNode;
if (next) next.prev = targetNode;
};
cmd.forEach((c) => {
switch (c[0]) {
case "U":
moveSelectedNode(c.split(" ")[1], "prev");
break;
case "D":
moveSelectedNode(c.split(" ")[1], "next");
break;
case "C":
deleteNode();
break;
case "Z":
recoverNode();
break;
}
});
let result = Array(n).fill("O");
cStack.forEach((node) => {
result[node.index] = "X";
});
return result.join("");
}
Javascript Linked List
* Node 를 Function으로 object를 사용해 구현
Javascript를 이용한 Linked List 구현
Javascript에서 연결리스트는 객체를 통해 구현할 수 있다.아래 예시는 두개의 객체를 next로 연결하여 Linked List의 기본적인 구조를 보여준다연결리스트의 핵심은 node이며, node는 data를 담는 data field
velog.io
foreach
* Array 객체의 메소드 forEach는 for문과 달리 index와 조건식, 증감식 없이 callback함수를 통해 기능을 수행
한줄평
연결리스트 너무 오랜만이라 기억이 잘 안났는데, 다시 보니까 새록새록하다
'스터디 > 알고리즘' 카테고리의 다른 글
[Algorithm] 프로그래머스 - 게임 맵 최단거리 (0) | 2023.03.22 |
---|---|
[Algorithm] 프로그래머스 - N으로 표현 (0) | 2023.03.21 |
[Algorithm] 프로그래머스 - 정수 삼각형 (0) | 2023.02.01 |
[Algorithm] 프로그래머스 - 등산코스 정하기 (5) | 2023.01.25 |
[Algorithm] 프로그래머스 - 셔틀버스 (1) | 2023.01.23 |
Comments