본문 바로가기

백준 11586 - 지영 공주님의 마법 거울 (객체에 함수 저장) JS 본문

개발/algorithm

백준 11586 - 지영 공주님의 마법 거울 (객체에 함수 저장) JS

자전하는명왕성 2023. 9. 11. 10:40

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

 

해당 문제는 주어지는 '심리상태'에 따라 값을 출력하는 문제이다. (난이도 자체는 쉬운 편)

다만 '심리상태'에 따라 조건 분기를 해줘야 하는데 이 경우에 불필요하게 반복되는 코드가 많아져 코드를 읽기가 불편할 수가 있다.

이를 타파하기 위해 객체 안에 함수를 저장하여 조건분기를 했는데, 먼저 이를 적용하지 않은 코드를 살펴본다.

const fs = require('fs')
const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt")
  .toString().trim().split('\n')

function solution(data) {
  const [_, ...arr] = data
  const state = arr.pop()

  if(state === '1') {
    console.log(arr).join('\n')
  }
  else if(state === '2') {
    console.log(arr.map(el => el.split('').reverse())
    .map(x => x.join('')).join('\n'))
  }
  else if(state === '3') {
    console.log(arr.reverse()).join('\n')
  }
}


solution(input)

 

객체 안에 함수를 작성하여 사용할 경우 다음과 같다.

const fs = require('fs')
const input = fs.readFileSync(process.platform === "linux" ? "/dev/stdin":"입력.txt")
  .toString().trim().split('\n')

const funTable = {
  '1' : (arr) => arr,
  '2' : (arr) => {
    return arr.map(el => el.split('').reverse())
      .map(x => x.join(''))
  },
  '3' : (arr) => arr.reverse()
}


function solution(data) {
  const [_, ...arr] = data
  const state = arr.pop()
  console.log(funTable[state](arr).join('\n'))
}

solution(input)

객체 funTable 에는 '심리상태'에 맞는 함수들이 저장되어 있다.

console.log(funTable[state](arr).join('\n'))

해당 코드에서 funTable[state : 심리상태](매개변수 : 배열) 을 전달하면, 심리상태에 맞는 값을 리턴 받을 수 있다.

 

객체 안에 함수화해서 활용했을 때의 장점은

- if문을 사용하여 조건분기를 하지 않으니 코드가 길어지지 않으며,

- 퍼사드 패턴과 유사하게 각 코드의 역할 구분이 쉬우며,

- 앞서 존재했던 (console.log / join('\n')) 과 같이 반복되는 코드들을 줄일 수 있다는 이점이 존재한다.

 

물론 이는 조건 분기를 해야 할 때 위 방식을 무조건 사용해야 한다는 정론은 아니며,

조건 분기를 다른 방식으로 표현할 수 있다는 방식 중 하나로 볼 수 있을 것이다.

Comments