๐Ÿ“ algorithm

[๋ฐฑ์ค€] Z - JavaScript ๋ฌธ์ œ ํ’€์ด

c0zi 2025. 2. 12. 10:47

๐Ÿ’™ ๋ฌธ์ œ ์„ค๋ช…

 

ํ•œ์ˆ˜๋Š” ํฌ๊ธฐ๊ฐ€ 2N × 2N์ธ 2์ฐจ์› ๋ฐฐ์—ด์„ Z๋ชจ์–‘์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2×2๋ฐฐ์—ด์„ ์™ผ์ชฝ ์œ„์นธ, ์˜ค๋ฅธ์ชฝ ์œ„์นธ, ์™ผ์ชฝ ์•„๋ž˜์นธ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์นธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•˜๋ฉด Z๋ชจ์–‘์ด๋‹ค.

 

N = 1

 

N > 1์ธ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์„ ํฌ๊ธฐ๊ฐ€ 2 ^ N-1 × 2 ^ N-1๋กœ 4๋“ฑ๋ถ„ ํ•œ ํ›„์— ์žฌ๊ท€์ ์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

๋‹ค์Œ ์˜ˆ๋Š” 2^2 × 2^2 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋ฐฉ๋ฌธํ•œ ์ˆœ์„œ์ด๋‹ค.

 

N = 2

 

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, rํ–‰ c์—ด์„ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š”์ง€ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋‹ค์Œ์€ N=3์ผ ๋•Œ์˜ ์˜ˆ์ด๋‹ค.

 

๐Ÿ’› ์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N, r, c๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

๐Ÿ’š ์ถœ๋ ฅ

 

rํ–‰ c์—ด์„ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๐Ÿšซ ์ œํ•œ์‚ฌํ•ญ

  • 1 ≤ N ≤ 15
  • 0 ≤ r, c < 2N
  • ์‹œ๊ฐ„์ œํ•œ : 0.5 s

โค๏ธ ๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ•

 

1๏ธโƒฃ while ๋ฐ˜๋ณต๋ฌธ

 

๊ฐ ๊ฐ€๋กœ์™€ ์„ธ๋กœ์˜ n์„ 2๋กœ ๋‚˜๋ˆ„๋ฉด, 4๋ถ„๋ฉด์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

์ด๋•Œ, 4๋ถ„๋ฉด ๊ธฐ๋ฐ˜์œผ๋กœ r์ด 2 ^ n/2๋ณด๋‹ค ํฌ๋ฉด 3, 4๋ถ„๋ฉด์— ํ•ด๋‹นํ•œ๋‹ค.

c์ด 2 ^ n/2๋ณด๋‹ค ํฌ๋ฉด, 2, 4๋ถ„๋ฉด์— ํ•ด๋‹นํ•œ๋‹ค.

 

3, 4๋ถ„๋ฉด์ธ ๊ฒฝ์šฐ์—๋Š” 1, 2๋ถ„๋ฉด๋งŒํผ ์ˆœ์„œ๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2 ^ n * 2 ^ (n - 1).

2, 4๋ถ„๋ฉด์ธ ๊ฒฝ์šฐ์—๋Š” r์—์„œ ์ด๋ฏธ 4๋ถ„๋ฉด์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ์—, 1๋ถ„๋ฉด์ธ ๊ฒฝ์šฐ๋งŒ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. (1 / 4์‚ฌ๋ถ„๋ฉด)

์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2 ^ (n - 1) * 2 * (n - 1).

 

n ์ด 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ด ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด๊ฐ€๋ฉด์„œ, n์„ 1์”ฉ ๋นผ์ค€๋‹ค.

 

let fs = require("fs");
let [n, r, c] = fs
  .readFileSync(0, "utf8")
  .trim()
  .split(" ")
  .map(Number);

function solution(n, r, c) {
  let visitedCount = 0;

  while (n >= 1) {
    // ํ˜„์žฌ n์„ ๊ธฐ์ค€์œผ๋กœ 4์‚ฌ๋ถ„๋ฉด์„ ๊ทธ๋ ค ํฐ ๊ฒฝ์šฐ
    if (r >= 2 ** (n - 1)) {
      visitedCount += 2 ** (2 * n - 1);
      r %= 2 ** (n - 1);
    }
    if (c >= 2 ** (n - 1)) {
      visitedCount += 2 ** (2 * n - 2);
      c %= 2 ** (n - 1);
    }

    n--;
  }

  return visitedCount;
}

console.log(solution(n, r, c));

 

์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” n๋ถ€ํ„ฐ 1๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ O(n)์ด๋‹ค.

 

2๏ธโƒฃ ๋น„ํŠธ ์—ฐ์‚ฐ์ž

 

2 ^ n ๋ฌธ์ œ์ธ ๊ฒƒ์„ ๋ณด์ž๋งˆ์ž ๋น„ํŠธ ์—ฐ์‚ฐ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์•„์ง ๋น„ํŠธ์—ฐ์‚ฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ด์Šˆ๋กœ ๋น„ํŠธ์—ฐ์‚ฐ์ž๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.

 

let fs = require("fs");

// ํŒŒ์ผ์—์„œ ์ž…๋ ฅ๊ฐ’์„ ์ฝ์–ด์™€ ์ˆซ์ž๋กœ ๋ณ€ํ™˜ (n: ํ–‰๋ ฌ ํฌ๊ธฐ ์ง€์ˆ˜, r: ํ–‰ ์ธ๋ฑ์Šค, c: ์—ด ์ธ๋ฑ์Šค)
let [n, r, c] = fs.readFileSync("test.txt", "utf8").trim().split(" ").map(Number);

function solution(n, r, c) {
  let order = 0; // ๋ฐฉ๋ฌธ ์ˆœ์„œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜

  // ํฐ ํ–‰๋ ฌ(2^n × 2^n)์„ ์ž‘์€ ๋‹จ์œ„(2×2)๊นŒ์ง€ ์ชผ๊ฐœ๋ฉด์„œ ํƒ์ƒ‰
  for (let i = n - 1; i >= 0; i--) {
    /**
     * (r >> i) & 1 : r์˜ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ์ถ”์ถœ
     * r >> i        : r์„ i๋น„ํŠธ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ (์ฆ‰, i๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ ๋งจ ์˜ค๋ฅธ์ชฝ์— ์œ„์น˜)
     * & 1           : ๋งจ ์˜ค๋ฅธ์ชฝ ๋น„ํŠธ๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋จธ์ง€๋Š” 0์œผ๋กœ ์„ค์ • (๋น„ํŠธ ๋งˆ์Šคํ‚น)
     */
    let rowBit = (r >> i) & 1; // r์˜ i๋ฒˆ์งธ ๋น„ํŠธ ์ถ”์ถœ → ํ˜„์žฌ ํ–‰์˜ ์‚ฌ๋ถ„๋ฉด ์ •๋ณด

    /**
     * (c >> i) & 1 : c์˜ i๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ์ถ”์ถœ
     * ์›๋ฆฌ๋Š” r๊ณผ ๋™์ผํ•˜๋ฉฐ, ํ˜„์žฌ ์—ด์ด ์–ด๋А ์‚ฌ๋ถ„๋ฉด์ธ์ง€ ํ™•์ธํ•˜๋Š” ์—ญํ• 
     */
    let colBit = (c >> i) & 1; // c์˜ i๋ฒˆ์งธ ๋น„ํŠธ ์ถ”์ถœ → ํ˜„์žฌ ์—ด์˜ ์‚ฌ๋ถ„๋ฉด ์ •๋ณด

    /**
     * ํ˜„์žฌ ์‚ฌ๋ถ„๋ฉด์˜ ์ˆœ์„œ ๊ณ„์‚ฐ
     * rowBit * 2 + colBit : 4๊ฐœ์˜ ์‚ฌ๋ถ„๋ฉด ์ค‘ ๋ช‡ ๋ฒˆ์งธ์ธ์ง€ ํŒ๋ณ„
     *  - (0,0) → 1์‚ฌ๋ถ„๋ฉด (์ขŒ์ƒ) → 0
     *  - (0,1) → 2์‚ฌ๋ถ„๋ฉด (์šฐ์ƒ) → 1
     *  - (1,0) → 3์‚ฌ๋ถ„๋ฉด (์ขŒํ•˜) → 2
     *  - (1,1) → 4์‚ฌ๋ถ„๋ฉด (์šฐํ•˜) → 3
     * 
     * (1 << (2 * i)) : 2^2i ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ํ˜„์žฌ ํ–‰๋ ฌ ํฌ๊ธฐ์— ๋งž๊ฒŒ ์ด๋™
     *  - i = 2 → (1 << 4) = 16
     *  - i = 1 → (1 << 2) = 4
     *  - i = 0 → (1 << 0) = 1
     * 
     * ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์‚ฌ๋ถ„๋ฉด์˜ ํฌ๊ธฐ๋งŒํผ ์ด๋™ํ•˜์—ฌ order๋ฅผ ์—…๋ฐ์ดํŠธํ•จ.
     */
    order += (rowBit * 2 + colBit) * (1 << (2 * i));
  }

  return order; // ์ตœ์ข… ๋ฐฉ๋ฌธ ์ˆœ์„œ ๋ฐ˜ํ™˜
}

console.log(solution(n, r, c)); // ๊ฒฐ๊ณผ ์ถœ๋ ฅ

 

chat gptํ•œํ…Œ ์ฃผ์„์„ ์จ๋‹ฌ๋ผ๊ณ  ๋ถ€ํƒํ–ˆ๋”๋‹ˆ ์—ด์‹ฌํžˆ ์จ์คฌ๋‹ค. 

๋ฌธ์ œ ํ’€์ด์—์„œ ๋” ๊ฐœ์„ ํ•  ๋ถ€๋ถ„ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.