[LeetCode]Design Browser History

Icarus<Wing>ยท2025๋…„ 4์›” 10์ผ
post-thumbnail

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๊ฐ€ ๋  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚˜์˜จ๋‹ค.

๐Ÿค”Array๊ฐ€ ์•„๋‹ˆ๋ผ Doubly LinkedList๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ์ด์œ 

๋ฌธ์ œ ์š”๊ตฌ์‚ฌํ•ญ ์ค‘ visit() ํ•จ์ˆ˜๋Š” ๋‹จ, ๋ชจ๋“  ์•ž์˜ ๊ธฐ๋ก์€ ๋‚ ๋ผ๊ฐ„๋‹ค. ๋ผ๋Š” ์กฐ๊ฑด์ด ํ•ต์‹ฌ์ธ๋ฐ, ๋งŒ์•ฝ์— Array๋กœ ๊ตฌํ˜„ํ•˜๊ณ  visit()๋กœ ์ƒˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ forward()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด,
๋ฉ”๋ชจ๋ฆฌ์— ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ์–ด์„œ ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์›์†Œ์— ์žˆ๋Š” ๊ธฐ์กด url์„ ๋ฆฌํ„ดํ•˜๋‹ˆ๊นŒ ์กฐ๊ฑด์— ์œ„๋ฐฐ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๐Ÿ‘‰๋”ฐ๋ผ์„œ, List์˜ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ LinkedList๋ฅผ ์„ ํƒํ•œ๋‹ค.

์–ด์งœํ”ผ ํŠน์ • ์›์†Œ์— ์ ‘๊ทผ์—์„œ value๋งŒ ์ฝ์œผ๋ฉด ๋˜๋Š”๋ฐ, ์™œ
๐Ÿ’ก๋” ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, ์ด์ „์— ํ•™์Šตํ–ˆ๋˜ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ CRUD ํ•จ์ˆ˜ ๊ตฌํ˜„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ BrowserHistory ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ Node cur๊ฐ€ homepage ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜๋ฉด ๋œ๋‹ค.

class LinkedList {
	Node head;
    
    public LinkedList() {
    	this.head = null;
    }
  • visit(): append()ํ•จ์ˆ˜์™€ ๋น„์Šทํ•˜๊ฒŒ cur ํฌ์ธํ„ฐ๋ฅผ ์ด๋™์‹œ์ผœ์„œ newNode๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.
  • back(): cur๋ฅผ ๊ธฐ์ ์œผ๋กœ ์ด์ „ ๋…ธ๋“œ๋กœ ์ด๋™์‹œํ‚ค๊ณ , ๋งŒ์•ฝ steps > x ๋ผ๋ฉด cur.prev != null์ผ ๋•Œ๊นŒ์ง€ ๊ณ„์†ํ•ด์„œ ๋’ค๋กœ ์ด๋™์‹œํ‚ค๊ณ  null์ด ๋‚˜์˜ค๋ฉด cur.url์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.
    • ํ˜„์žฌ ๋…ธ๋“œ ์ˆ˜๋งŒํผ์˜ x step ๋’ค๋กœ ์ด๋™ํ•˜๋ผ๊ณ  ํ•˜๋ฉด, ๊ฐ„๋‹จํ•˜๊ฒŒ step์ด 0์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ step์„ 1์”ฉ ๊ฐ์†Œ์‹œํ‚ค๋ฉด์„œ ๋’ค๋กœ ์ด๋™์‹œํ‚ค๊ณ  0์ด ๋˜๋ฉด cur.url์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.
    • forward(): back๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

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)์ด ๊ฑธ๋ฆฐ๋‹ค.

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€