오늘은 중간에 생각난거지만 비로그인부분도 확인을 해야 하는데
비로그인 헤더를 수정하기로 했다.
헤더 부분의 css를 수정하고 링크를 달아줬는데
a태그일 때는 상관없던 줄과 색변경이 또 일어났다.
분명 link는 a태그 처리가 되고 a태그와 같은 적용을 받는데 변경되는 부분은
이해할 수 없었지만 이전에 처리한 것과 같은 방식으로 처리하려고 했다.
그런데 이 부분은 li의 css를 다르게 설정했어서 각 설정 내부에 a태그로 수정을 아래와 같은 방식으로 처리했다.

li:first-child {
      border: 1px solid #7aa7c7;
      background-color: #e1ecf3;
      color: #2c5877;
      a {
        text-decoration: none;
      }
      a:visited {
        color: #2c5877;
      }
    }
    li:nth-child(2) {
      border: 1px solid #1095fa;
      background-color: #1095fa;
      color: #ffffff;
      a {
        text-decoration: none;
      }
      a:visited {
        color: #ffffff;
      }
    }

 

상단의 돋보기를 넣어주는데 absolute로 조정해 무리없이 넣어줄 수 있었으나
같은 컴포넌트 내에서 상태값을 통해 내부 css를 관리하다보니 이상한 충돌이 난 것인지
login 상태에서는 className이 부여되지 않는 이상한 일이 벌어졌다.
조건을 반대로 만들고 순서를 바꿔도 적용되지 않고 하나의 클래스명만 들어가는데
검색을 해봐도 이런 일은 없는 것 같아 당황스럽다.

이유는 너무 간단했다..
로그인 헤더와 비로그인 해더를 상태값으로 나타내주긴 하지만
div값 자체를 통으로 추가하거나 날렸기 때문에
이 헤더는 로그인시에는 보이지 않는 헤더 부분이었기 때문에 이 부분의 css를 아무리 건드려도 통하지 않는 것이었다.
한마디로 상위 div가 어차피 사라지기 때문에 상태값을 여기서 신경쓸 필요가 없었다.


 

 


CT(1).가장 긴 바이토닉 부분 수열이라는 문제는 조금 특이했는데 특정 포인트 까지는 올라가가는 부분 수열의 갯수를 측정하고 그 뒤로는 내려가는 부분 수열을 갯수를 측정해야 하는 문제였다. 처음에는 당황했지만 생각보다 어렵지 않은 문제였는데 올라가는 부분 수열은 1,3,2,5,4,7,6,2,8,1이라는 숫자가 있는 경우 1,3,5,7,8으로 올라가고 반대로 내려가는 부분 수열은 뒤에서부터 카운터 할 경우 (역순) 1,2,6,7같은 느낌으로 dp에 담기고 그 dp를 합친 다음 max값을 찾으면 되는 간단한 문제였다.!!
코드는 아래와 같다.

let input = `10
1 5 2 1 4 3 4 5 2 1`.split('\n')[1].split(' ').map(Number)

let dp = new Array(input.length).fill(0) // 기존 오르막 dp
let dp2 = new Array(input.length).fill(0) //내리막 dp
let dpSum = new Array(input.length).fill(0) //합칠 dp

for(let i = 0 ; i < input.length ; i++){
    let max = 0 //비교 max값 초기화
    for(let j = 0 ; j < i ; j++){
        if(input[i] > input[j] && dp[j] > max){ //현재 max값 찾기 위한 조건
            max = dp[j] // 현재 비교값보다 작은 숫자중 최대 max값 찾은 후 
        } 
    }
    dp[i] = max +1 // 현재값이 max값을 가진 숫자보다 크기 때문에 그 값에서 dp+1해주기
    dpSum[i] += dp[i] //dpSum에 현재값 저장
}

for(let i = input.length-1 ; i >= 0 ; i--){//위의 함수 역순 실행 
    let max = 0
    for(let j = input.length-1 ; j >= i ; j--){
        if(input[i] > input[j] && dp2[j] > max){
            max = dp2[j]
        } 
    }
    dp2[i] = max +1 //역순진행에서 최대값 dp 구해주기
    dpSum[i] += dp2[i]-1 // 현재 값이 계산에서 겹치므로 -1 해주고 더해주기
}

console.log(Math.max(...dpSum)) //Max값 찾아서 출력


CT(2).짜증나는 문제가 또 나타났다.. js로는 풀 수 없는 문제인데 공식 답변이 1년 전 node.js의 업데이트로 인해 기본 용량이 커져서 기존 정답자들의 코드로도 통과하지 않는다고 한다.
이런 메모리가 적은 문제들은 정답자를 확인하고 존재하면 진행하는데 중간 패치로 인해 제출자체가 의미 없이질줄은 몰랐다..ㅠㅠ
이 문제만 풀면 골드3이 확정이었기 때문에 더 신나게 제출하고 더 크게 좌절하는 감도 있다.
게다가 이 문제는 클래스 4 문제기 때문에 이중 삼중으로 스트레스를 받는다.
일단 통과될 코드는 아래와 같다.

let input = `3
1 2 3
4 5 6
4 9 0`.split('\n').slice(1) // input 받아오기(숫자 날리기)

let dp1 = []
let dp2 = [] 
let num = input.length
for(let i = 0 ; i < num ; i++){ //dp값에 깊은복사 느낌으로 데이터 전달
    input[i] = input[i].split(' ').map(Number)
    dp1.push([...input[i]])
    dp2.push([...input[i]])
}

for(let i = 1 ; i < num ; i++){
    for(let j = 0 ; j < 3 ; j++){ //3칸기준으로 내려가기 때문에 0~2 고정
        if(j === 0 ){
            dp1[i][j] += Math.max(dp1[i-1][0], dp1[i-1][1]) // 0이면 0,1에서 올 수 있다
            dp2[i][j] += Math.min(dp2[i-1][j], dp2[i-1][j])
        }
        else if(j === 1){
            dp1[i][j] += Math.max(dp1[i-1][0], dp1[i-1][1], dp1[i-1][2]) // 1이면 0,1,2 모든 방향에서 가능하
            dp2[i][j] += Math.min(dp2[i-1][0], dp2[i-1][1], dp2[i-1][2])
        }
        else if(j === 2){
            dp1[i][j] += Math.max(dp1[i-1][1], dp1[i-1][2]) // 2면 1,2에서만 올 수 있다.
            dp2[i][j] += Math.min(dp2[i-1][1], dp2[i-1][2])
        }
    }
}

console.log(Math.max(...dp1[num-1]), Math.min(...dp2[num-1])) //최하단 값들의 max, min을 출력

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

[Pre-Project 개발일지]-12  (1) 2022.09.05
[Pre-Project 개발일지]-11(주말)  (0) 2022.09.04
[Pre-Project 개발일지]-9  (0) 2022.09.02
[Pre-Project 개발일지]-8  (0) 2022.09.01
[Pre-Project 개발일지]-7  (0) 2022.08.31

+ Recent posts