회고

[Main-Project 개발일지]-16

Happy Programmer 2022. 9. 23. 23:41

오늘은 팀 회의로 시작했다.
백엔드 멘토링 시간이 어제 저녁이었기 때문에 오늘 열린 것 같다.
일단 아이디/비밀번호 찾기는 조금 더 과정이 있어야 하기 때문에 우선순위에서는 미루는 것으로 결정이 났고 api를 사용하게 되면 어떤 방식으로 검색을 할 것인지에 대한 이야기도 했는데
일단 Tag와 재료명을 검색한 뒤 해당하는 내용이 있을 경우 출력하는 방식으로 진행하고
나중에 시간이 있을 경우 로직을 강화해서 주 재료 목록에 있는 내용들과 냉장고에 들어있는 재료들을 전체 비교한다음 점수가 높은 순서대로 몇개를 보여주는 방식을 선택할 것 같다.

프론트에서 처리가 가능하긴 하겠다 라고 생각했던 부분들이지만 비밀번호 같은 경우는 보안에 위배가 될 수 있기 때문에 프론트에서 무작위 사람이 비밀번호 변경을 요청하는 것이 아닌 백엔드 측에서 처리하게 해야 한다고 했기 때문에 오늘 할 비밀번호 랜덤화 및 메일링 등도 적용할 수 없어졌고 레시피 추천 api같은 경우도 프론트엔드에서 객체형태 데이터로 추가해서 사용해볼까 생각했지만 천개가 넘는 재료로 구성된 파일 자체를 열면 터지는 등(우분투라 그럴지는 모르겠지만) 문제가 발생해서 백엔드에서 하기로 했으니 기다리기로 했다.

회의를 마무리하고 버튼 이동을 사용하려고 했으나 history를 사용하려면 뭔가 useHistory를 사용해 상태를 관리해줘야 하는 것 같았다.
예전에 배운 것은 -1로 넘어가거나 -2등 이동이 가능했던 것 같은데 이건 뭔가 아니다 싶어 계속 검색해보니 window.history.back();등은 상태가 없어도 가능한 것을 알게되어
그냥 상태값 없이 버튼을 누르면 뒤로가기가 눌러지는 것 처럼 반응하게 만들었다.

버블링의 해결 또한 간단하게 onClick={(event) => event.stopPropagation()}를 사용한 다음 전체페이지 부분에 onClick={backPage}느낌으로 뒷 배경을 누를 경우 뒤로가게 만들어줬다.

이제 곧 프론트엔드 작업이 1차 통합될 예정인데 통합된 다음부터는 뭔가 그럴듯해 보일 것 같다.

통합을 완료하기 전 회의하기 전에 나왔던 메모창의 위치를 헤더부분으로 결정하고 프론트 팀원님이 figma를 수정해주신 다음 내가 헤더에 해당 버튼을 만들어 두고 모달로 된 메모장은 다음에 추가하기로 헀다.

 

 

 

 

CT(1).2의 멱수의 합은 x개의 동전들로 만들 수 있는 가짓수를 구하는 문제와 유사하지만 그 동전의 종류는 2의 제곱으로 구성된 숫자(0~n)라는 차이점이 있다.
현재 금액보다 큰 동전(멱수)은 필요하지 않기 때문에 while을 통해 동전(멱수)의 배열에 push하는 방식으로 처리한 다음 기존의 동전과 유사하게 dp를 통해 해결했다.

let input = 7
let nums = [1] //멱수집합으로 input이 1 이상이기 때문에 1은 넣고 시작한다.
let now = 2

while(now <= input){  //어디까지의 멱수가 필요한지 구하는 과정
    nums.push(now)
    now *= 2
}

let dp = new Array(input+1).fill(0) //기본적인 동전구하기 dp 셋팅
dp[0] = 1

for(let i = 0 ; i < nums.length ; i++){ //동전마다 순회
    for(let j = 1 ; j <= input ; j++){ //금액순회
        if(nums[i] <= j){  //동전보다 금액이 커진 순간부터 dp처리
            dp[j] = (dp[j] + dp[j-nums[i]])%1000000000 //큰 수를 위한 나머지처리
        }      
    }
}
console.log(dp[input]) //결과값 출력(이중dp로도 가능하지만 단일로도 가능)



CT(2).방문 길이라는 문제는 특정 경로로 움직이는 선의 중복되지 않은 이동거리를 구하는 문제였다. 간단하게 해결할 수 있을 줄 알고 a,b(행,열)값을 백틱으로 배열에 추가한 다음 중복을 제거했다. 하지만 그렇게 할 경우 점으로 찍히기 때문에 해당 점을 지나가는(십자가형 이동) 경로인 경우 포함되지 않았다. 그래서 a,a2,b,b2로 이전 경로까지 포함해 선분으로 만들어 포함시켰다. 반정도는 통과했지만 나머지 반정도는 통과하지 않았고
곰곰히 생각해보니 x1->x2와 x2->x1은 백틱으로 표기했을 때 엄연히 다른 데이터로 취급된다는 사실을 알았다. 그래서 그냥 간단하게 x1->x2 y1->y2, x2->x1 y2->y1 두가지를 다 push해버리고 중복값을 제거한 다음 length/2로 해결했다!
뭔가 남들보다 참신하게 해결헀을 것 같아 기분이 좋아졌다.

function solution(dirs) {
    let answer = []
    let a = 0
    let b = 0
    let a2 = 0
    let b2 = 0
    for(let i = 0 ; i < dirs.length ; i++){
        if(dirs[i] === "U" && a < 5){
            a++
            answer.push(`${a2} ${b2} ${a} ${b}`)
            answer.push(`${a} ${b} ${a2} ${b2}`)
            a2++
        }
        else if(dirs[i] === "D" && a > -5){
            a--
            answer.push(`${a2} ${b2} ${a} ${b}`)
            answer.push(`${a} ${b} ${a2} ${b2}`)
            a2--
        }
        else if(dirs[i] === "L" && b > -5){
            b--
            answer.push(`${a2} ${b2} ${a} ${b}`)
            answer.push(`${a} ${b} ${a2} ${b2}`)
            b2--
        }
        else if(dirs[i] === "R" && b < 5){
            b++
            answer.push(`${a2} ${b2} ${a} ${b}`)
            answer.push(`${a} ${b} ${a2} ${b2}`)
            b2++
        }
    }
    let result = [...new Set(answer)]
    return result.length/2
}




CT(3).모음 사전은 2단계에 낮은 정답률에 비해 1점밖에 되지 않는 문제였다. 5글자의 모음을 통해 만들 수 있는 길이 1~5인 문자열 중 제공되는 문자열의 idx값을 구하는 문제로 
하나의 앞자리당 781개의 문자가 들어있다는 것을 제공해 주는 것을 보고 규칙을 찾아 각 자릿수별로 값을 할당해 더하는 문제라고 생각했는데 그 규칙을 찾기 위해 엉성하게 만든 재귀로 바로 통과가 되는 것을 보고 당황했다.

function solution(word) {
    let arr = ["","A","E","I","O","U"]

let result = []

function recurtion (n,str){
    if(n === 0){
        result.push(str)
        return
    }
    for(let i = 0 ; i < 6 ; i++){
        recurtion(n-1,`${str}${arr[i]}`)
    }
}
recurtion(5,"")
let data = [...new Set(result)].sort()
    return data.indexOf(word)
}



CT(4).피로도라는 문제도 완전탐색이라 모든 코드를 다 하려고 했는데 여기서 문제가 발생했다. 던전의 갯수 즉 배열의 길이가 8이기 때문에 이걸 일반적 재귀로 처리하면 1677만개의 처리를 해야 하기 때문에 당연히 시간초과가 걸릴 수 밖에 없을 것 같아 포기했고 obj로 0,1,2,3 등의 idx값에 1을 넣어준 다음 0으로 바꿔서 중복임을 확인할 수 있게 하는 방식을 선택했다(indexOf는 오래걸리기 때문에) 하지만 obj는 주소값이 같기 때문에 구조분해 할당 또는 재할당을 하려고 했으나 재할당으로는 주소가 변경되지 않고 전체 내용을 구조분해 할당하기에는 길이를 정확하게 알 수 없어 처리할 수 없었다.
잘 생각해보니 idx를 따지기 위한 것이므로 배열 0,1,2 위치에 1을 넣은 다음 조회하면 obj와 같은 기능을 한다는 사실을 깨닫고 arr로 변경한 다음 구조분해할당을 사용하자 깔끔하게 문제가 해결되었다.

function solution(k, dungeons) {
    var answer = []
    let arr = []
    let max = 0
    for(let i = 0 ; i < dungeons.length ; i++){
        arr.push(1)
    }
    function recurtion(sum,left,n,arr){
        if(n === 0){
            max = Math.max(max,sum)
            return
        }
        for(let i = 0 ; i < dungeons.length ; i++){
            if(arr[i]){
                let c = [...arr]
                c[i] = 0
                let [a,b] = dungeons[i]
                if(a <= left){
                    recurtion(sum+1,left-b,n-1,c)
                }
                else{
                    recurtion(sum,left,n-1,c)
                }
            }
        }
        
    }

    recurtion(0,k,dungeons.length,arr)
    
    return max;
}