Skip to content

[Codetree] 흰검 칠하기 (Hard) #1

Description

@luke0408

링크

흰검 칠하기

풀이

주의: 다른 참여자의 학습을 위해 풀이는 반드시 아래 토글 기능을 사용하여 가려주세요!

풀이 확인하기 (클릭)

1. 접근 방식 (논리적 흐름)

[문제 해석]

  • 음수로도 무한한 인덱스를 가져야 한다.
    • Array는 사용 불가
  • 각 타일은 4가지 상태 값을 가진다.
    • 0 - un, 1 - w, 2 - b, 3 - g
  • 각 타일을 객체로 관리한다.
    • {w_count: number, b_count: number, state: number}
  • 회색이 된 (state == 3) 타일은 더 이상 바뀌지 않는다.
  • 각 타일은 고유한 위치를 가진다.
    • Key - Value 로 접근하자. => map 선택

[문제 계획]

  • 타일의 색 변화를 추적하기 위해 좌표(정수 인덱스) 기반으로 관리한다.
  • 각 타일에 대해 “흰색으로 칠한 횟수”, “검은색으로 칠한 횟수”, “최종 상태(흰/검/회색)”를 관리한다.
  • 명령 x L/x R 처리 시 현재 위치 포함 x칸을 순회하며 칠한다.
  • 타일마다 흰/검 칠 횟수를 갱신한 뒤, 두 색이 각각 2회 이상인 순간부터는 회색으로 고정한다.
  • 명령 처리 후 현재 위치를 마지막 칠한 타일로 갱신한다.
  • 모든 명령 종료 후 흰/검/회색 타일 개수를 출력한다.

2. 해결 코드 (또는 Pseudocode)

const fs = require("fs");
const input = fs.readFileSync(0).toString().trim().split('\n');

const n = Number(input[0]);
const commands = input.slice(1).map(line => line.split(' '));

// Please Write your code here.
const tiles = new Map(); // {key: position, value: {w, b, state}}
let pos = 0;

const getTile = (p) => {
    let t = tiles.get(p);

    if (!t) {
        t = { w: 0, b: 0, state: 0 };
        tiles.set(p, t);
    }

    return t;
}

for (let i = 0; i < n; i++) {
    const step = commands[i][1] === 'L' ? -1 : 1;

    for (let j = 0; j < commands[i][0]; j++) {
        const p = pos + step * j;
        const t = getTile(p);

        if (t.state !== 3) {
            if (commands[i][1] === 'L') t.w += 1;
            else t.b += 1;

            if (t.w >= 2 && t.b >= 2) {
                t.state = 3; // gray, fixed
            } else {
                t.state = commands[i][1] === 'L' ? 1 : 2;
            }
        }
    }

    pos = pos + step * (commands[i][0] - 1);
}

let w = 0, b = 0, g = 0;
for (const t of tiles.values()) {
    if (t.state === 1) w++;
    else if (t.state === 2) b++;
    else if (t.state === 3) g++;
}

console.log(`${w} ${b} ${g}`);

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions