회고

[개발일지] - 415

Happy Programmer 2024. 8. 21. 23:21

오전까지 빠르게 요청사항을 처리하려고 했는데

갑작스럽게 전혀 관련없는 쪽의 업무 관련해서 문의가 들어오더니

내 자리에서 대규모 토론회가 열려버렸다.

 

대략 한시간 가량 Asset 관련 확인을 해야 했는데

이후 다시 케이스 등록 후 다우오피스 템플릿 관련 수정 요청사항을 처리했다.

 

필드 요청사항 중 Owner Name을 요청하는 부분이 있었는데

직접 접근이 되지도 않았고 수식 필드로도 되지 않았지만

이전에 했던 경험이 있기 때문에 Owner:User.LastName를 사용해서 해결할 수 있었다.

 

이 org의 경우에는 이미 이런 문제들 떄문에 Name이 아닌 LastName을 이름으로 사용하지만

다른 회사의 경우에 통일이 되지 않았다면 FirstName + LastName 형태로 구성해야 할 수도 있다.

 

이후 미결판매 관련 필드들을 생성해야 했는데

여러가지 조건에 따라서 날짜들이 변경되는 기록을 추적해야 했고

각각의 날짜 필드들과 변경 전 필드를 생성하고 fm필드로 두 필드의 날짜 차이도 만들었다.

 

처음에는 상식 선에서 아래와 같이 abs를 추가해서 절대값으로 표기하고

리포트 등에서 특정 날짜 이상이 갑자기 차이나는 것들을 조회할 수 있게 했는데

의외로 -3 등의 날짜가 아니라 3이라는 수치가 나오는 것을 보고 문의를 주셨고

요청사항대로 절대값을 제거하고 일반 차이가 나오도록 변경처리했다.

ABS( FLOOR((DateTime1__c - DateTime2__c)) )

 

이 필드들을 만들고 적용하는 것은 간단할 것이라고 생각했지만

OrderItem과 연결하는 부분과 연결된 경우 이전 값들 비교 등

map에 담아서 비교한 값들을 다시 map에 담은 현재 개체 값 비교를 위해 가져오는 등

여러 작업이 필요했고 여러 조건들이 필요했다.

 

사실 개발은 순조롭게 잘 됐는데 테스트가 되지 않아 디버그 등 여러개를 찍어야 했는데

알고보니 SAP쪽에서 예전에 보넀던 테스트 데이터 내부에 중복값이 너무 많아서

윗부분의 값을 아무리 수정해도 뒷부분에 중복값들이 있어서 덮어씌워지기 때문에 표기되지 않았었고

해당 문제 인지 후 3개만 남기고 테스트 한 결과 정상적으로 모든 로직이 동작하는 것을 확인할 수 있었다.

 

운영 배포 후 완료되었다는 내용을 고객사에 전달하려고 했는데

일부 DocNum같은 필드들이 숫자 타입으로 들어온 것들이 확인되었고

String Type으로 변경 요청이 있었기 때문에 유사 필드들을 다시 변경하려고 했지만

이미 운영에 배포가 되었기 때문에 해당 필드들을 전부 주석처리하고 배포한 다음

다시 필드들의 타입들을 변경해주고 다시 재배포한 다음 마무리했다.

 

SAP에서 Number로 관리하는 값이라서 정의서에도 Integer Type으로 넘어왔기 때문에

백여개가 넘는 필드작업을 할 때 뇌를 비우고 작성하느라 숫자로 들어갔는데

정의서만 믿지 말고 조금 더 확인할 필요가 있는 것 같다.

 

 

(1).백준 27172번 수 나누기 게임은 각각 숫자 카드를 한장 가지고 있고

서로의 카드와 대결해서 나누어 떨어지는 쪽이 지는 어둠의 듀얼을 모두와 한다고 할 때

각각의 승점을 출력해야 하는 문제였다.

 

처음에는 이게 왜 골드인지 의아할 정도로 간단하다고 생각하고 for문 순회 처리를 했다가

조합이 생각나서 이중포문 내부에서 i+1로 시작하게 해서 조합 형태로 처리해줬는데

시작하자마자 시간초과로 오답이 나버렸고

그제서야 문제 태그에 에라토스테네스의 체가 걸려있는 것을 보고

소수를 구할 때처럼 각각의 배수가 있는지만 확인해서 n*n의 복잡도에서 상당히 복잡도를 낮출 수 있어서 통과했다.

 

100만의 복잡도가 맥스인 데이터라 대략 5~10초 걸렸을 것 같은데

어쨌거나 조건에 따라 시간복잡도를 이렇게까지 최적화할 수 있다는 것을 다시 한번 느낄 수 있었고

코드를 구현할 때도 간단한 문제 같아도 규모가 커진다면 최적화 할 수 있는 방법을 고려해야 한다는 것을 느꼈다.

const input = `4
7 23 8 6`.split('\n')[1].split(' ').map(Number)

const result = new Array(input.length).fill(0)

// for(let i = 0 ; i < input.length-1 ; i++){
//     for(let j = i+1 ; j < input.length ; j++){
//         if(input[i] % input[j] == 0){
//             result[i]--
//             result[j]++
//         }
//         if(input[j] % input[i] == 0){
//             result[i]++
//             result[j]--
//         }
//     }
// }

// console.log(result.join(' '))

const max = 1000000
const index = Array(max + 1).fill(-1)

for(let i = 0 ; i < input.length ; i++){
    index[input[i]] = i
}

for (let i = 0; i < input.length; i++) {
    for (let j = input[i] * 2; j <= max; j += input[i]) {
        if (index[j] !== -1) {
            result[i]++
            result[index[j]]--
        }
    }
}

console.log(result.join(' '))