일단 개발일지라고 적기는 헀지만 이게 개발이라고 할 수 있는 부분인지는 잘 모르겠다.
어제까지는 팀 규칙을 정하고 회고를 하는 날이라 회고로 넘어갔지만
오늘부터는 아이디어 회의 등을 진행하는 날이기 때문에 개발일지로 시작했다.
다음주 금요일까지 4일간의 추가적인 기간동안 아이디어 선택, 사용자 요구사항 정의서, 화면 정의서, API 요구사항 등을 정리해야 한다.

저녁에 멘토분이 검토를 한번 해주시기로 해서 나온 아이디어 중 하나를 선택한다 안한다로 1시간 넘게 토론한 것은 미뤄지고 내일쯤 다시 결정하기로 했다.

프론트,백엔드의 코드리뷰로 다음 진행이 예정되어 있었는데
신기하게 프론트/백엔드를 나누는게 아닌 전체 리뷰를 한번 진행해
각자 어떤 기능이 가능하고 Main-Project 때 어떤 부분의 요청을 할 수 있는지에 대해
궁금한 점을 서로에게 물어보는 시간을 가졌다.

백엔드에서는 특히 데이터를 어떻게 보내고 받아오는지 프론트쪽의 동작을 궁금해하셨고
이미지의 처리를 어떻게 진행하는게 좋은지에 대한 이야기를 하고 넘어갔다.

프론트, 백엔드끼리 나눠져서 코드리뷰를 하고 정리하기로 했는데
프론트쪽은 저번에 프론트 팀원분께서 CRUD 중 U(update)부분이 잘 안된다고 하셔서
둘이 같이 update 부분을 구현해보고 완성된 내용을 git에 올리는 것으로 리뷰를 마무리했다.

개발일지라고 정해서 진행하고 싶은데 추석연휴에도 개발공부는 하겠지만
Main-Project와는 관련없는 카카오톡 코딩테스트 대비 알고리즘 학습(평소에도 하지만)이 주가 될 것 같은데 2,3,4로 작성을 해야하는지 의문이 든다..
정 애매하면 프로젝트를 위한 버튼이나 기능들을 조금 더 학습하는 방향으로 가야겠다.

저녁에 멘토님이 오셨는데 https://docs.netlify.com/routing/redirects/rewrites-proxies/#proxy-to-another-service 를 참조해보라는 조언을 해주셨다.
이건 이미 다 적용해봤는데 의미가 있을까 생각했다가
ssl오류? 때문에 검색해보다가 아래의 코드를 입력했다는 사실이 기억났다.
    <!-- <meta
      http-equiv="Content-Security-Policy"
      content="upgrade-insecure-requests"
    /> -->
이 코드 때문에 http 요청이 아닌 https 요청이 날아갔던 것이다.

이 코드를 지우고 멘토님이 알려주신 방법을 사용해 재배포를 해보려고 했으나
기존에 프론트 팀원님이 하신 작업은 서버가 없었기 때문에(끝까지 서버와 소통이 안돼서) 로컬 json 소통으로 처리하셨기 때문에 그 부분을 하나씩 수정하는데 충돌나는 부분도 있고 어느정도 시간이 많이 걸렸다.

갑자기 또 아이디어를 미리 정해둬야 연휴간 작업할 수 있으니 아이디어 선택부터 하자는 의견이 떠올라서 1시간가량 시간을 또 보내고

다시 read, post, delet, update 부분에 들어가는 데이터를 다 정리해서 하는데 2시간도 더 걸린 것 같다. 기존과 다른 주소와 들어오는 데이터의 형태가 다르고 심지어 키의 명칭도 달라서 제대로 처리되지 않았다.

다 구성하고 나니 update가 되지 않아 30분 넘게 씨름하다 백엔드쪽에 연락을 해보니 PATCH는 postman으로는 보내지지만 내부 처리를 정의하지 않아? 적용이 안된다고 한다...ㅠ

알려주신 방법이 https와 http가 소통하는 방법인 줄 알았는데 
자세히 읽어보니 그 방법이 아닌 CORS를 배포한 후에도 우회할 수 있는 방법이었다.
결국 클라이언트만 열심히 수정하고 https는 해결할 수 없었다.

git으로 배포하면 http가 되는지 궁금해서 배포를 시도했지만
git으로 배포해도 똑같이 https가 되고 리액트를 build해서 올리면 안된다는 사실을 알았다.
404가 뜨는데 js로 경로를 통일하고 페이지 주소도 확인하고 index.html로 시도도 해봤지만 할 수 없었다..

내일은 아이디어 필수 구현 기능과 알고리즘위주로 가야겠다.





CT(1).통학 경로라는 문제는 dp로 처리하는 것은 같지만 해당 위치가 되면 처리를 하지 않고 continue를 통해 넘어가 기존 new Array로 생성한 0의 값을 유지했다.
해결 코드는 아래와 같다.

let input = `5 4
3
2 2
2 3
4 2`.split('\n')

for(let i = 0 ; i < input.length ; i++){
    if(i === 1){ // 범위, 갯수, 장애물좌표로 갯수는 arr가 아니기 때문에 예외처리
        input[i] = Number(input[i])
    }
    else{
        input[i] = input[i].split(' ').map(Number) // a,b형태로 쪼개주기
    }
}

let dp = []
for(let i = 0 ; i < input[0][0] ; i++){
    dp.push(new Array(input[0][1]).fill(0)) //dp 0채우기
}
let blocks = [] // 장애물 위치 (indexOf 사용할 목적)
for(let i = 2 ; i < 2+input[1] ; i++){
    let [a, b] = input[i]
    blocks.push(`${a-1} ${b-1}`) //장애물 추가(dp는 0부터 시작하므로 1,1로 시작하던 좌표값에서 1씩 빼주기)
}
for(let i = 0 ; i < input[0][0] ; i++){
    for(let j = 0 ; j < input[0][1] ; j++){
        let str = `${i} ${j}` //좌표값 비교용 i,j 형태 맞추기
        
        if(i === 0 && j === 0){ //시작좌표 1 지정
            dp[0][0] = 1
        }
        else if(blocks.indexOf(str) !== -1){ 장애물 위치는 0으로 고정
            continue
        }    
        else if(i === 0){ //벽인 경우 i/j가 0이면 0이 아닌 부분의 값만 넘겨오기
            dp[0][j] += dp[0][j-1]
        }
        else if(j === 0){
            dp[i][0] += dp[i-1][0]
        }
        else{ // 벽이 아닌 경우 왼쪽, 위 두곳에서 넘어올 수 있는 가짓수 더해주기
            dp[i][j] =  dp[i][j] + dp[i-1][j] + dp[i][j-1]
        }
    }
}

console.log(dp[input[0][0]-1][input[0][1]-1]) // 1,1이 아닌 0,0 시작이므로 1씩 뺀 dp좌표 구해주기

 


CT(2).행렬의 덧셈이라는 문제는 행렬의 i,j좌표를 구해 이중 for문으로 해결했다.


CT(3).직사각형 별찍기는 '*'.repeat(a)과 for문을 통해 해결했다.


CT(4).부족한 금액 계산하기는 금액이 70억?대까지 올라갈 수 있는 상황이라 BigInt를 사용했는데 백준과는 다르게 Number type으로 반환해야 해서(생각해보면 거긴 출력이고 여긴 return이라 숫자값이 맞다) Number(String(x))라는 기형적인 결과물을 내보냈다.


CT(5).최솟값 만들기는 알 수 없는 문제였다.. dp를 통해 모든 경로에서 이동하는 방향을 구하려고 하다 에러가 생기고 그 다음은 가능한 모든 경우의 수를 재귀로 구한 다음 최소값을 출력시켰는데 2번까지만 통과하고 (테스트케이스20개) 나머지는 다 시간초과에 걸렸다.
그래서 최소, 최대끼리 곱하도록 정렬하고 계산시키니 바로 통과했다. 조금은 허탈했다.
아래 코드는 정답과 시간초과(정답)이다.

function solution(A,B){ // 정답
    var answer = 0
    A.sort((a,b) => a-b)
    B.sort((a,b) => a-b)
    for(let i = 0 ; i < A.length ; i++){
        answer += A[i]*B[A.length-1-i]
    }

    return answer;
}

solution([1,2],[3,4])
function solution(A,B){
    var answer = [];
    let arr = []
    for(let i = 0 ; i < A.length ; i++){
        arr.push(new Array(A.length).fill(0))
    }
    for(let i = 0 ; i < A.length ; i++){
        for(let j = 0 ; j < A.length ; j++){
            arr[i][j] = A[i] * B[j]
        }
    }

    function recurtion(a,sum,nows){
        if(a === A.length){
            answer.push(sum)
            return
        }
        for(let i = 0 ; i < A.length ; i++){
            if(nows.indexOf(i) === -1){
                recurtion(a+1,sum + arr[a][i],[...nows, i])
            }
        }
    }
    recurtion(0,0,[])
    
    console.log(arr)
    return Math.min(...answer);
}

 


CT(6).최대공약수와 최소공배수는 유클리드 호제법을 이용해 공약수, 두 수의 곱/공약수로 처리했다

 


CT(7).올바른 괄호는 쉬운 문제인데 시간초과로 걸렸다.
몇번 돌리다보면 통과할 때가 있다고 해서 해보니 통과했다..
JS가 무거워서 더 오래 걸리는걸까?
'(' ++ , ')' -- , now === 0 false의 방식으로 처리했다.

 


CT(8).피보나치수는 dp를 많이 풀어 1분도 안걸려서 풀었지만 무려 12점을 줬다..!
 dp[i] = (dp[i-1] + dp[i-2])%1234567를 for문 돌렸다.


CT(9).숫자의 표현은 최대가능수치를 구한 후 거기까지 구하는 방식으로 처리했으나
23개의 테스트케이스 중 오답이 3개나 나와버렸다.
아래부터 값이 올라가게 if를 걸어봤으나 무의미한 시도였다
생각해보면 가능한 최대수치까지이기 때문에 값의 제한은 의미가 없다..
등차수열을 활용하는 부분은 알겠지만 마지막 오답 3개의 차이는 이해하기 애매하다.
결국 for문 안에 max 대신 함수값을 넣어줬고
처리를 비교로 했는데 통과하는 부분을 보면 허탈하다.

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

[Main-Project 개발일지]-3(추석)  (0) 2022.09.10
[Main-Project 개발일지]-2(추석)  (1) 2022.09.09
Pre-Project 개발회고  (2) 2022.09.07
[Pre-Project 개발일지]-13  (0) 2022.09.06
[Pre-Project 개발일지]-12  (1) 2022.09.05

+ Recent posts