[취업준비일지] - 101
1.input에 name을 설정하는 이유를 모르고 있었는데
e.target에서 name을 가져올 수 있었고
이를 통해 가져온 값을 useState등을 사용할 때 사용할 수 있었다.
예를 들어 아래와 같이 id, password를 동시에 관리하는 state의 경우
target으로 변경해야 할 키와 값을 받을 수 있기 때문에
객체 형태로 관리하더라도 switch나 if문의 사용 없이 변경할 수 있다.
const [inputData, setInputData] = useState({id:'', password:''})
const inputHandler = () => {
const {value, key} = e.target
setInputData({ ...inputData, [key]:value })
}
다만 객체 내부에 변수로 key값을 주기 위해서는
key: vaule 형태가 아닌 [key]:value 형태로 넣어야 하며
그렇지 않을 경우 아래와 같이 key의 변수명이 들어가버린다.
let name = "happy"
let mood = "sad"
let obj = {[name]:mood}// => {happy : "sad"}
let anotherObj = {name : mood}// => => {name : "sad"}
2.DOM을 특정해 조작하고 싶은 경우에는 ref를 사용할 수 있다.
아래와 같이 useRef를 import 한 다음
ref 변수명을 생성하고
그 ref를 사용하고 싶은 곳에 매칭시킬 수 있고
매칭된 경우 ref변수명.corrent.focus()등의 조작을 가할 수 있다.
이는 모달이나 제출 등을 눌렀을 때 포커스를 변경하거나
특정 키를 눌렀을 때 강조하는 등을 위해 필요하며
엔터키를 누를 경우 채팅창이 활성화되는 등의 기능도 가능하다.
import {useRef} from 'react'
const targetName = useRef();
//예시는 이상하지만 모달이 팝업될 경우 하단 input 입력창이 깜빡인다.
const modalPop = () => {
targetName.current.focus();
}
<input ref = {targetName}/>
(1).백준 18111 마인크래프트는 N x M 넓이의 땅에 집을 지으려고 할 때
높이가 제각각인 블럭을 정돈해 평평하게 만든다는 내용이었다.
제거 작업을 하면 2초의 시간이 걸리고 블록을 한개 얻으며
추가 작업을 하면 1초의 시간이 걸리고 블록을 한개 소비한다.
다행히 이동에 걸리는 시간은 게산하지 않기 때문에 비교적 쉽게 해결할 수 있었다.
각 높이별로 들어가는 시간을 계산했고
계산하기 위해 제공받은 N*M의 이중배열을 1*(N*M)의 일차배열로 변경했다.
또한 게산해야 하는 높이의 구간을 확인하기 위해
생선한 heightArr(각 땅의 높이만 저장)의 max, min 값을 저장했으며
해당 높이를 구현하기 위해 들어가는 블록의 갯수보다
현재 보유한 블록의 갯수가 적을 경우 처리하지 않았다.
처음에는 작은 층에서 높은 층으로 이동했지만
높은 층부터 진행하는 것이 시간복잡도에 영향을 주지 않지만
낮은 층부터 진행할 경우에는 높은 층부터 역순정렬이 필요했기 때문에
높은 층에서 낮은 층으로 조회하게 변경한 다음
들어가는 비용이 적은 순서로 정렬해 같은 비용 대비 최고 높은 층을 출력했다.
const input = `3 4 0
64 64 64 64
64 64 64 64
64 64 64 63`.split('\n').map(el => el.split(' ').map(Number))
const heightArr = []
const eachHeightCost = []
const blockAmount = input[0][2]
for(let i = 1 ; i < input.length ; i++){
heightArr.push(...input[i])
}
const maxHeight = Math.max(...heightArr)
const minHeight = Math.min(...heightArr)
const calculateFlatCost = (floor) => {
let add = 0
let remove = 0
for(let i = 0 ; i < heightArr.length ; i++){
if(floor > heightArr[i]){
add += floor-heightArr[i]
}
else if(floor < heightArr[i]){
remove += heightArr[i] - floor
}
}
return [add, remove]
}
for(let i = maxHeight ; i >= minHeight ; i--){
const [add, remove] = calculateFlatCost(i)
if(blockAmount + remove - add >= 0){
eachHeightCost.push([add*1 + remove*2, i])
}
}
console.log(eachHeightCost.sort((a,b) => a[0] - b[0])[0].join(' '))