티스토리 뷰

https://www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

스택으로 풀었음.

const fs = require('fs');
const [n,...arr] = fs.readFileSync("./dev/stdin").toString().trim().split("\n");

const N = +n
const board = arr.map(v=>v.split('').map(v=>+v))

class Node{
  constructor(item){
    this.item = item;
    this.next = null;
  }
}

class Stack{
  constructor(){
    this.topOfStack = null;
    this.length = 0;
  }

  push(item){
    const node = new Node(item);
    if(this.topOfStack!=null){
      node.next = this.topOfStack; 
    }
      this.topOfStack = node;
      this.length+=1;
  }

  pop(){
    if(this.length==0)return -1;
    const popItem = this.topOfStack;
    this.topOfStack = popItem.next;
    this.length-=1;

    return popItem.item
  }

  size(){
    return this.length;
  }

  empty(){
    if(this.length==0) return 1;
    else return 0;
  }

  top(){
    if(this.length==0)return -1;
    return this.topOfStack.item; 
  }
}


let answer =''
let stack = new Stack();
stack.push([0,0,N])
while(!stack.empty()){
  let temp = stack.pop();
  if(temp=='left') {
    answer='('+answer
  }
  else if(temp=='right') {
    answer=')'+answer;
  }
  else{
    const [y,x,n] = temp;
    
    let same = true;
    let first = board[y][x];
    for(let i = y; i<y+n; i++ ){
      for(let j = x; j<x+n; j++ ){
        if(board[i][j]!=first){
          same=false;
          break;
        }
      }
      if(!same)break;
    }
    if(same)answer=first+answer;
    else{
      stack.push('left')
      stack.push([y,x,n/2])
      stack.push([y,x+n/2,n/2])
      stack.push([y+n/2,x,n/2])
      stack.push([y+n/2,x+n/2,n/2])
      stack.push('right')
    }
  }

}

console.log(answer)
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함