백준 11586 - 지영 공주님의 마법 거울 (객체에 함수 저장) JS 본문
반응형
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')) 과 같이 반복되는 코드들을 줄일 수 있다는 이점이 존재한다.
물론 이는 조건 분기를 해야 할 때 위 방식을 무조건 사용해야 한다는 정론은 아니며,
조건 분기를 다른 방식으로 표현할 수 있다는 방식 중 하나로 볼 수 있을 것이다.
반응형
'개발 > algorithm' 카테고리의 다른 글
프로그래머스 - Lv.2 전화번호 목록 (해시) JS (0) | 2023.09.13 |
---|---|
백준 1487 - 물건팔기 (reduce) JS (0) | 2023.09.12 |
백준 1388 - 바닥장식 (DFS) JS (0) | 2023.09.10 |
프로그래머스 - Lv.3 가장 먼 노드 (BFS) JS (0) | 2023.09.09 |
백준 2910 - 빈도정렬 JS (0) | 2023.09.08 |
Comments