회원가입/로그인 부분이 드디어 cors가 해결되었다고는 하는데
그 해결 방법이 allow all이었다.
사실 all, *로 해결하는 방법은 보안등 여러 면에서 비추천하기는 하지만
테스트가 가능해 질 것 같다는 좋은 신호이기 때문에 일단 프론트와 합을 맞춘 다음
그 부분은 따로 해결하시는게 맞을 것 같다.(어차피 10일정도 남았으니)

백엔드분들과 계속해서 소통하는 시간을 가지고 있는데
일단 회원가입 로그인쪽은 추가로 하자고 넘어간 상황인데
재료CRUD 부분에 대해 카테고리, 날짜데이터, 객체관리(colder, freezer)등에 대한 이야기가 있었다.
카테고리 같은 경우는 멘토님이 그렇게 하는게 좋다고 10가지 모두를 각자 등록해서 Type지정?같은걸 하셨는지 다른게 들어오면 안된다는 말씀을 하시고 다 영어이름으로 바꾸셨는데 입,출력 비교등이 전부 string 한국어(재료 분류 태그)이기 때문에 영어 고정값으로 하는게 오히려 손해인 상황이었다. 

아마 데이터베이스로 생각한다면 수천만 억단위로 넘어갈 경우에는 그게 맞겠지만 개인 냉장고에 들어갈 재료 자체가 100개도 되기 힘들고 각각의 태그 재료도 열개가 안되는데 굳이 그렇게 정리하지 않아도 입력값 자체가 태그로 분류된 버튼을 클릭하면 고정값(한국어 string)이 날아가기 때문에 이게 더 관리도 안정적이라고 생각되어 변경을 요청드렸고
string으로 바꾸는건 오히려 너무 쉽기 때문에 바로 해주실 수 있다고 하셨다.
다만 이렇게 각자 분류를 변경하는데 시간이 오래 걸렸는데 멘토님이 추천해주셔서 구현부터 한 부분을 조금 아쉬워하셨다. 

백엔드에서는 당연히 냉장,냉동,전체조회를 따로 해야 한다고 생각하셔서 전부 구현하셨지만 사용자의 입장이라고 생각하면 전체 조회는 페이지 시작할 때 이미 들어가는데 추가로 데이터를 소비해 냉장,냉동을 받을 필요가 없어서 그 부분은 사용할 일은 없을 것 같다고 말씀드렸고 서버가 가동되야 진행을 할 수 있는데 일단 구현면은 완료가 되었다고 하니
서버를 담당하시는 백엔드분이 서버를 가동시키시면 냉장고 재료부분 처리를 제일 먼저 한 다음 회원가입/로그인으로 넘어가고 그 사이 재료관리하시는 백엔드분이 메모를 처리하고 회원가입/로그인은 구현 체크 후 헤더에서 넘어온 부분을 다시 유지하고 토큰을 주고받는 부분에 대해 진행하면 순서가 맞을 것 같다.

로그인/회원가입 부분을 맞춰보는데 대충 5번째까지 시도해도 제대로 맞지가 않았다
초반에는 빌드된 파일이 다른 파일이었기 때문이었고 그 뒤로는 헤더를 보냈다고 하는데 접근할 수 가 없는 문제였다.
network 부분을 들어가서 Authorization에 토큰이 담겨져 있는 모습은 볼 수 있는데 접근이 되지 않아 검색해보니 아래와 같은 코드를 추가해 접근권한을 열어줘야 한다고 한다.
config.addExposedHeader("Authorization");

다시 또 수정하고 새로 빌드한 다음 만나기로 했다.

위 코드를 적용한 다음 빌드하고 오시니 Authorization이 확실히 보이고
이 부분을 console로 출력이 가능했으며 그 말은 그 데이터를 상태값으로 넣어 언제든 다른 요청시 header에 넣을 수 있다는 의미이기도 했다.
https도 적용중이라고 하는데 이제 좀 단계가 나가는 느낌이다.

내일은 쿠키? 토큰?을 가지고 로그인화면에서 메인으로 이동되며 돌아다닐 수 있게 적용하고 싶은데 아직 냉장고 데이터와 로그인쪽 데이터가 합쳐지지 않았기 때문에 제대로 체크하기는 애매한 상황이다.






CT(1).Bulls and Cows라는 문제는 기존의 dp를 구조적으로 바꿔서 적용해야했다.
조건이 달라지기 때문에 받아오는 조건값을 length의 마지막으로 잡아줬으며 dp의 이중배열로 처리하여 문제를 해결했지만 안타깝게도 메모리 제한에 걸려버렸다.
시간제한은 1초로 여유있었기 때문에 이중배열이 아닌 before / after 배열로 만들어 종료 후 after배열의 값을 더해주는 방식으로 풀었다.

let input = `4 2`.split(' ').map(Number) //마릿수 , 이격거리

let before = new Array(input[1]+1).fill(0) //before만 dp처럼 선언
before[0] = 1
let after = [] // after는 0부터 이전 배열에서 더해서 채우므로 배열 타입만 선언
let sum = 0 // 결과값으로 들어갈 sum 선언

for(let i = 0 ; i < input[0] ; i++){
    for(let j = 0 ; j <= input[1] ; j++){ //구분을 사이 거리로 결정했다.
    //0인 경우 0마리(투입가능), 1인경우 바로 옆 같은 방식으로 넘어가다가
    //최종 한도치에 도달하면 다시 투입이 가능하므로 0마리에 더해주는 방식이다.
        if(j === 0 ){ //투입가능은 이격거리 준수 + 이전에 소 투입(소가 순함)
         after[j] = (before[0] + before[input[1]])%5000011
        }
        else{ // 이격거리에 해당하는 다른 모든 부분은 황소 투입이 안되므로
         //당연히 소를 투입했다는 가정하에 이격거리가 1씩 늘어남
         after[j] = before[j-1]
            
        }  
    }
    before = [...after] //현재 값을 다시 before로 넣어줘서 이차배열의 다음배열 부분을 계산한다
}

for(let i = 0 ; i <= input[1] ; i++){
    sum += after[i]
}
console.log(sum%5000011) //나머지 조건대로 출력





CT(2).프린터라는 문제는 설명이 조금 복잡했고 스택/큐를 사용해야 할 것 같다는 부담감이 있어서 미뤘지만 효율적으로 pop을 사용해 처리할 수 있었다. 최고시간이 0.49ms인걸 보면 (0.0005초) 스택,큐라도 시간복잡도만 고려한다면 클래스 구현 없이 처리해도 될 것 같다는 생각이 들었다.

function solution(priorities, location) {
    let answer = 0; //동작횟수
    let arr = [] //우선순위,타겟여부가 들어있는 이중배열 타겟이 b면([[a,1],[b,0],[c,1]])
    let poped = 1 //while문을 돌리기 위한 재료로 위에서 타겟만 0을 부여해 중단할 수 있게 했다.
    let maxArr = [...priorities].sort((a,b) => a-b) // 현재 처리해야할 max값을 구하기 위한 배열 오름차순 정리(shift가 아닌 pop을 쓰기 위한 오름차순)
    for(let i = 0 ; i < priorities.length ; i++){ 
        if(i === location){ //위에서 언급한 타겟만 0을 부여하고 
            arr.push([priorities[i],0])
        }
        else{ //타겟이 아닌 나머지는 모두 1을 부여해 while 조건순회
            arr.push([priorities[i],1])
        }
    }
    
    while(poped){ //default 1이며 타겟만 0으로 바뀌게 설계
        let max = maxArr.pop() //내부에서 찾을 현재 최고 우선순위 뽑아내기
        let index //최고 우선순위이며 중복된 값 중 최저index값 저장예정
        for(let i = 0 ; i < arr.length ; i++){
            if(arr[i][0] === max){ // 앞에서부터 max와 같으면 i저장 후 중단
                index = i
                break
            }
        }
        if(index === 0){ //index가 0이었다면 맨 앞 값만 제거하면 된다.
            poped = arr[index][1] //아까 추가한 target여부 체크
            let pop = arr.shift() 
        }
        else{ //index가 0이 아니면 index 앞의 값들을 구조분해 할당으로 뒤로 보낸다.
            poped = arr[index][1] 
            arr = [...arr.slice(index+1), ...arr.slice(0,index)]
        }
        answer++ //1회당 answer에 1씩 더해준다.
    }
    
    return answer; 
}




CT(3).괄호 회전하기는 각 괄호를 체크하는 함수를 불러와 for문으로 문자열을 돌려가며 입력해 true일 경우 answer++처리로 해결했다.

function solution(s) {
    var answer = 0;
    for(let i = 0 ; i < s.length ; i++){
        if(check(s.slice(i) + s.slice(0,i))){
            answer++
        }
    }
    return answer
}
    function check(str) {
      const stack = [];
      const opener = {
        '{': '}',
        '[': ']',
        '(': ')',
      };
      const closer = '}])';
      for (let i = 0; i < str.length; i++) {
        if (str[i] in opener) {
          stack.push(str[i]);
        } else if (closer.includes(str[i])) {
          const top = stack.pop();
          const pair = opener[top];
          if (pair !== str[i]) {
            return false;
          }
        }
      }
      return stack.length === 0;
    };




CT(4).뉴스 클러스터링도 어려워 보였지만 문자열을 정렬한 후 비교로 처리하니 생각보다 간단하게 처리할 수 있었다. 심지어 시간도 0.77ms가 최대치였다.
초반에 효율성같은 까다로운 조건들이 많은 문제들을 풀고 겁먹어서 시간복잡도 최적화가 안될 것 같은 문제들은 피하는 모습을 보였는데 최근 시간복잡도 걸릴 것 같은 문제들도 의외로 조건이 작아 그냥 통과되는 모습들을 볼 수 있어 도전해보니 크게 어렵지는 않았다.

function solution(str1, str2) {
    let stra = str1.toUpperCase()
    let strb = str2.toUpperCase()
    let arr1 = []
    let arr2 = []
    for(let i = 0 ; i < stra.length-1 ; i++){
        if(stra[i].charCodeAt() >= 65 && stra[i].charCodeAt() <= 90 && stra[i+1].charCodeAt() >= 65 && stra[i+1].charCodeAt()  <= 90){
            arr1.push(stra[i]+stra[i+1])
        }
    }
    for(let i = 0 ; i < strb.length-1 ; i++){
        if(strb[i].charCodeAt() >= 65 && strb[i].charCodeAt() <= 90 && strb[i+1].charCodeAt() >= 65 && strb[i+1].charCodeAt()  <= 90){
            arr2.push(strb[i]+strb[i+1])
        }
    }
    let aa = arr1.length
    let bb = arr2.length
    for(let i = 0 ; i < arr1.length ; i++){
        if(arr2.indexOf(arr1[i]) !== -1){
            arr2.splice(arr2.indexOf(arr1[i]),1)
        }
    }
    let cc = bb-arr2.length
    if(aa === bb && bb === cc){
        return 65536
    }
    else{
        return Math.floor(65536 *cc/(aa+bb-cc))
    }
}

'회고' 카테고리의 다른 글

[Main-Project 개발일지]-22  (0) 2022.09.29
[Main-Project 개발일지]-21  (0) 2022.09.28
[Main-Project 개발일지]-19  (2) 2022.09.26
[Main-Project 개발일지]-18(주말)  (0) 2022.09.25
[Main-Project 개발일지]-17(주말)  (0) 2022.09.24

+ Recent posts