
https://leetcode.com/problems/design-browser-history/description/
๋น์ ์ homepage๋ก๋ถํฐ ์์ํ๋ ๋ธ๋ผ์ฐ์ ํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋น์ ์ ๋ค๋ฅธ url ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ ์ ์๊ณ , ๊ธฐ๋ก์ ์๋ steps๋งํผ ๋ค๋ก ์ด๋ํ๊ฑฐ๋ ์์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
BrowserHistory(string homepage): homepage ์ธ์๋ฅผ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํด๋ผ.void visit(String url): ํ์ฌ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํด๋ผ. ๋จ, ๋ชจ๋ ์์ ๊ธฐ๋ก์ ๋ ๋ผ๊ฐ๋ค.String back(int steps): ํ์ฌ ํ์ด์ง์์ ๋ค๋ก ์ด๋ํ๋๋ฐ, ๊ธฐ๋ก์์ x steps ๋งํผ ๋ค๋ก ๊ฐ ์ ์๊ณ , steps > x๋ผ๋ฉด x steps๋งํผ ๊ฐ์ ํ์ฌ url ํ์ด์ง๋ฅผ ๋ฆฌํดํ๋ผ.String forward(int steps): ์์ ๋ง์ฐฌ๊ฐ์ง๐ง์ ์ฝ์กฐ๊ฑด
ํํ์ด์ง๋ url์ ๊ธธ์ด, ๊ทธ๋ฆฌ๊ณ steps๋ ์ฌ์ค์ ์๊ฐ๋ณต์ก๋์ ๊ด๋ จ์ด ์๋๋ฐ, ์ด์ ๋ ์ด ๋
ธ๋ ๊ฐ์์ ๋ฐ๋ผ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ
BrowserHistory๋ฅผ ์์ฑํ ๋, homepage๋ผ๋ ์ธ์๋ฅผ ๊ฐ๊ณ ์ธ์คํด์คํํ๋ค. ๊ทธ๋ฐ๋ฐ, back(int steps)์ steps๊ฐ ํ์ฌ ๊ธฐ๋ก๋์ด ์๋ ๋
ธ๋๋ณด๋ค ํฌ๋ค๋ฉด ๊ฒฐ๊ตญ์๋ homepage๋ฅผ ๋ฆฌํดํด์ผ ๋๋๋ฐ, return cur.url(=homepage)๊ฐ ๋๋ ค๋ฉด homepage๋ Node์ value๊ฐ ๋ ์ ๋ฐ์ ์๋ค๋ ๊ฒฐ๋ก ์ด ๋์จ๋ค.
๋ฌธ์ ์๊ตฌ์ฌํญ ์ค visit() ํจ์๋ ๋จ, ๋ชจ๋ ์์ ๊ธฐ๋ก์ ๋ ๋ผ๊ฐ๋ค. ๋ผ๋ ์กฐ๊ฑด์ด ํต์ฌ์ธ๋ฐ, ๋ง์ฝ์ Array๋ก ๊ตฌํํ๊ณ visit()๋ก ์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ ๋ค์ forward()๋ฅผ ํธ์ถํ๋ฉด,
๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ๋จ์์์ด์ ํ์ฌ ํ์ด์ง๋ฅผ ๋ฆฌํดํ์ง ์๊ณ ๋ค์ ์์์ ์๋ ๊ธฐ์กด url์ ๋ฆฌํดํ๋๊น ์กฐ๊ฑด์ ์๋ฐฐ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๐๋ฐ๋ผ์, List์ ์๋ฃ๊ตฌ์กฐ ์ค LinkedList๋ฅผ ์ ํํ๋ค.
์ด์งํผ ํน์ ์์์ ์ ๊ทผ์์ value๋ง ์ฝ์ผ๋ฉด ๋๋๋ฐ, ์
๐ก๋ ์ฝ๊ฒ ์๊ฐํ๋ฉด, ์ด์ ์ ํ์ตํ๋ ๋งํฌ๋ ๋ฆฌ์คํธ CRUD ํจ์ ๊ตฌํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก BrowserHistory ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ ๋ Node cur๊ฐ homepage ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ๋
ธ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํ๋ฉด ๋๋ค.
class LinkedList {
Node head;
public LinkedList() {
this.head = null;
}
append()ํจ์์ ๋น์ทํ๊ฒ cur ํฌ์ธํฐ๋ฅผ ์ด๋์์ผ์ newNode๋ฅผ ์ฐ๊ฒฐํ๋ฉด ๋๋ค.cur.prev != null์ผ ๋๊น์ง ๊ณ์ํด์ ๋ค๋ก ์ด๋์ํค๊ณ null์ด ๋์ค๋ฉด cur.url์ ๋ฆฌํดํ๋ฉด ๋๋ค.public class BrowserHistory {
private String homepage;
private Node cur; // ํฌ์ธํฐ๋ฅผ ์ด๋ํด์ url์ ๋ฆฌํดํ๊ธฐ ์ํจ
static class Node {
String url;
Node next;
Node prev;
public Node(String url) {
this.url = url;
this.next = null;
this.prev = null;
}
}
public BrowserHistory(String homepage) {
cur = new Node(homepage);
}
public void visit(String url) {
Node newNode = new Node(url);
cur.next = newNode; // ์์ฑ๋ ๋
ธ๋์ ์ฐ๊ฒฐ
newNode.prev = cur;
cur = cur.next; // cur๋ฅผ ์
๋ฐ์ดํธ
}
public String back(int steps) {
while (cur.prev != null && steps != 0) {
cur = cur.prev;
steps -= 1;
}
return cur.url;
}
public String forward(int steps) {
while (cur.next != null && steps != 0) {
cur = cur.next;
steps -= 1;
}
return cur.url;
}
}
โฐ์๊ฐ๋ณต์ก๋๋ ์์ฑ๋ ๋
ธ๋ ์ ๋งํผ back()๊ณผ forward()๋ฅผ ํ๊ธฐ ๋๋ฌธ์ O(N)์ด ๊ฑธ๋ฆฐ๋ค.