Skip to content

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

@luke0408

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}`);

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