(1).백준 1402번 아무래도이문제는A번난이도인것같다는

특정 조건을 만족시키면 yes, 아니면 no를 출력하는 문제지만

애드혹이니 뭐니 하지만 결국 모두 yes가 가능해서 주어진 케이스만큼 yes를 출력해서 해결했다.

const input = `1
6 5`.split('\n')

for(let i = 1 ; i < input.length ; i++){
    console.log('yes')
}

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

[개발일지] - 561  (0) 2025.01.14
[개발일지] - 560  (0) 2025.01.13
[개발일지] - 557  (0) 2025.01.10
[개발일지] - 556  (0) 2025.01.09
[개발일지] - 555  (0) 2025.01.08

파일 처리 관련 샘플데이터를 확인하는데

일단 구조적으로 연결도 문제지만 필드도 살짝 비정상적으로 AM, PM이 표기되는 것이 보였다.

 

구상 도중 SAP 전송 오류 문의가 들어와서 확인해봤는데

언제나처럼 SAP 서버 문제였고

해당 내용에 대해 SAP쪽 서버 중단으로 의심되며 timed out 발생 로그를 전달했는데

한참 뒤 결국 SAP에서 에러 발생 시 재기동이 되도록 세팅을 수정했고

이제는 이런 문의를 안받을 수 있을 것 같다는 생각이 들었다.

 

파일 관련 필드와 개체를 확인하고 관계를 구상한 다음

개체, 필드 생성 및 연결 작업을 진행했는데

갑작스럽게 2시에 회의 초대가 들어와서 회의에 참여했다.

 

인터페이스, 마이그레이션 관련 회의였지만 이번에도 살짝 고객사와 협력사쪽 대화가 많았는데

예전에는 정의서대로만 하면 되는데 이걸 굳이 들어야 하나 생각했곘지만

이제 프로세스도 알아두면 좋을 것 같다는 생각이 들어서 어찌저찌 열심히 들었다.

 

아래와 같이 price definition already exists in this price book 에러에 대한 질문을 받았는데

다른 사람들이 같이 작업하다보니 기존 데이터를 기반으로 PriceBookEntry를 만든 것 같은데

해당 엔트리를 삭제하려고 하다가 upsert로 처리되기 떄문에

upsert에 사용되는 키값과 동일하게 만들고 배치를 다시 돌리니 정상 처리되는 것을 확인했다.

System.DmlException: Upsert failed. First exception on row 9; first error: FIELD_INTEGRITY_EXCEPTION, This price definition already exists in this price book: []

 

정리하면 해당 에러가 나올 경우 만들려는 엔트리와 같은 Product2, PriceBook이 연결되었다는 것으로

생성할 Id 2개를 공유하는 엔트리가 있는지 조회해보면 바로 이 문제인지 파악할 수 있다.

 

파일 관련 개체 생성을 마무리하고 파일 관련 추가 필드가 확인되어 다시 추가해준 다음

유지보수쪽 실시간 조회 추가 문의가 들어왔는데

처음에는 내가 만들었던 개발쪽처럼 추가로 다른 기능을 만들고 싶다는 내용이라서

뭔가 내가 잘 만들었나 싶어서 뿌듯했었는데 알고보니 그것까진 아니었고

기능적으로 그런걸 원하는거라 필터 등 내용 검토만 같이 해드리고 마무리됐다.

 

자바서버 소통 방식에 대해서 파악한 다음

인터페이스 필드 수신 테스트에 대해 확인하다가 마무리하고 퇴근했다.

 

 

(1).백준 26736번 Wynik meczu는 A, B의 개수를 유형에 맞춰 출력해야 하는 문제로

그냥 순회하며 A인지 아닌지 체크해서 a, b를 백틱으로 기준에 맞춰 출력했다.

const input = `AAABBBA`
let a = 0
let b = 0

for(let i = 0 ; i < input.length ; i++){
    if(input[i] == 'A'){
        a++
    }
    else{
        b++
    }
}

console.log(`${a} : ${b}`)

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

[개발일지] - 560  (0) 2025.01.13
[개발일지] - 559(주말)  (0) 2025.01.12
[개발일지] - 556  (0) 2025.01.09
[개발일지] - 555  (0) 2025.01.08
[개발일지] - 554  (0) 2025.01.07

행분할 관련 에러 문의가 출근 전부터 전달로 넘어왔는데

확인해보니 인터페이스쪽 문제는 아니고 플로를 타고 넘어가서 알림/메일을 발송하는데

기존에 지정된 담당자가 비활성되어 비활성된 유저를 수신인으로 지정할 수 없다는 에러 때문에 중단된 것이었다.

 

팀 내부 Asset이 주문인지 아닌지에 대한 이야기가 있어서 확인해봤는데

Asset이 주문 제품 아래 딸린 느낌이라 주문이 아니라고 전달했지만

알고보니 그 부분이 중요한 주제가 아니었기 때문에 확인만 하고 마무리했다.

 

인터페이스 정의서를 확인하는데

새로 구현하는 것도 아니고 기존에 있던 것도 아니고

다른 곳에 구현된 내용을 이전하는 것인데 필드 정의가 애매해서 확인이 상당히 어려웠는데

사이트까지 들어가서 확인하다가 파일 관련 문제가 많아 보여서 샘플데이터를 요청했다.

 

중간에 기존 작성된 정의서 관련해서 같이 작성하는 분들의 문의사항도 답변하고

전달받은 데이터 샘플을 확인해서 필드에 대해서 파악하다가

정의서에 기재된 한도 등이 문제가 있어 보여서 다시 문의를 작성헀고

일단 개수 제한은 1자리로 적힌건 오류였고

이전하려고 하는 기존 시스템에서는 파일 전송 개수 제한이 존재했지만

수신하는 쪽의 제한은 없다고 확인받았기 때문에 일단은 제한 없이 구현하기로 했다.

 

첨부파일 전송이 아니라 링크로 주고받는 정의였기 때문에 링크를 확인했는데

SFDC의 경우에는 보안 문제로 로그인을 하지 않으면 전송된 링크로 받을 수 없고

DocumentLink 등으로 새로 만들어서 공유형 설정을 해줘야 링크를 사용할 수 있는데

이 부분을 또 트리거로 만들어서 연결해서 전달해야 할 것 같은데

내부적으로 올라온 부분은 직접 만들어야 하고

외부에서 들어온 부분은 개체로 따로 관리해야 할 것 같지만

두개가 같이 전송되는 등의 문제가 있을 수도 있어 보여서

어떤 방식으로 처리해야되는지 고민하다가

일단 내부적으로 트리거로 Document link를 연결하기로 결정했다.

 

 

(1).백준 27310번 :chino_shock:는 특이하게 문자열의 길이와 _는 추가로 +5, :는 추가로 +1을 해서 합을 구하라는데

처음에는 황당하게 각각 개수를 구해서 더할까 생각했는데

생각해보면 그냥 하나씩 확인해서 각각 2, 6점을 더하고 해당없는 경우 1점을 더하는 방식으로 해결했다.

const input = `:chino_very_shock:`
let sum = 0

for(let i = 0 ; i < input.length ; i++){
    if(input[i] == ':')[
        sum += 2
    ]
    else if(input[i] == '_'){
        sum += 6
    }
    else{
        sum += 1
    }
}

console.log(sum)

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

[개발일지] - 559(주말)  (0) 2025.01.12
[개발일지] - 557  (0) 2025.01.10
[개발일지] - 555  (0) 2025.01.08
[개발일지] - 554  (0) 2025.01.07
[개발일지] - 553  (0) 2025.01.06

오전 회의로 인해서 어제 한 작업을 등록한 다음 회의 준비를 했고

점심시간 전까지 회의가 지속됐다.

 

회의는 예상했던대로 우리쪽에서 뭔가 확인해줄만한 것도 거의 없었고

대부분 고객사 내부 상의가 대부분이었는데

고객사쪽도 다음 회의가 잡혀있었기 때문에 다행히 나머지는 내부 회의 후 결과를 알려주기로 했고

몇가지 수정사항만 정리된 다음 종료됐다.

 

오후에는 회의 관련 내용 정리 및 적용 전 필드를 확인해줬는데

갑작스럽게 전화가 와서 확인해보니 논의 중 일정 문제로 전체 중단 요청이 왔고

바로 팀장님이 혼자 하시던 프로젝트에 붙기로 했다.

 

중간에 유지보수 업무도 잠깐 들어와서 빠르게 처리해줬는데

그쪽 고객사 담당하시던 분이 갑작스럽게 장기 부재가 되어버려서 그런지

협조 요청이나 업무 처리가 대부분 삐걱거리는 느낌이 있었는데

일단 이 부분은 인터페이스 쪽이라 다음에 또 오면 내쪽으로 전달해주시면 될 것 같다고 했더니

오늘 처음으로 전달받을 수 있었다.

 

팀장님이 하시던 프로젝트 관련 인수인계를 받은 다음 필드 맵핑을 진행하는데

필드가 80여개가 되고 심지어 대부분의 필드는 존재하지 않아 새로 만들어야 했는데

새로 진행되는 부분이고 개발단에 대해서는 모르기 때문에 맵핑이 쉽지 않았다.

 

그래도 개발 담당자분에게 전달하기 전에 가능한 모든 부분은 체크하고 드려야 할 것 같아서

한참 필드 맵핑을 진행했는데 중간에 다른 업무 협조 요청으로

개발이 아닌 운영 필드로 바꿔서 확인한 부분이 있었는데

황당하게 운영에 있는 필드가 개발에 존재하지 않아서 다시 필드 재확인을 하느라 시간이 더 오래 걸렸다.

 

 

(1).백준 30676번 이 별은 무슨 색일까는 별의 크기에 따라서 색이 다르다는 내용으로

각 크기에 맞춰서 출력해주면 되는 문제로

원래는 다른 문제를 풀다가 12시가 거의 다 되어가기 때문에 일단 제출했는데

쉬운 문제지만 조건이 많아서 풀기는 귀찮은 그런 문제였다.

const input = 516

if(input >= 620 && input <= 780){
    console.log("Red")
}
else if(input >= 590 && input < 620){
    console.log("Orange")
}
else if(input >= 570 && input < 590){
    console.log("Yellow")
}
else if(input >= 495 && input < 570){
    console.log("Green")
}
else if(input >= 450 && input < 495){
    console.log("Blue")
}
else if(input >= 425 && input < 450){
    console.log("Indigo")
}
else if(input >= 380 && input < 425){
    console.log("Violet")
}
else {
    console.log("Invalid wavelength")
}

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

[개발일지] - 557  (0) 2025.01.10
[개발일지] - 556  (0) 2025.01.09
[개발일지] - 554  (0) 2025.01.07
[개발일지] - 553  (0) 2025.01.06
[개발일지] - 552(주말)  (0) 2025.01.05

출근하자마자 아침에 개발팀에 올라왔던 SFDC 25 릴리즈를 확인했는데

전반적으로 기능 개선을 하려고 노력하는 모습이 보이긴 했지만

한참 전부터 당연히 돼야 한다고 했던 부분들이 이제 조금씩 적용되는 것이기 때문에

실제 사용자가 아니라면 감흥보다는 이게 원래 안됐다고? 라는 생각이 들 것 같았다.

 

작업 목록을 정리해준 다음 회식 논의를 했고

마이그레이션 관련 회의에 참여했는데 30분으로 예정되었지만 1시간을 넘게 하게 되었다.

 

대부분 마이그레이션은 답이 좀 없는 느낌이 있었는데

저쪽에서도 정리를 해야 하고 이쪽에서도 맵핑을 해야 하고

정의서가 딱 떨어져서 인터페이스를 하는게 아니다보니 뭔가 복잡해보였다.

 

주간 작업 목록을 정리해준 다음

파일의 용량 제한 때문에 SFDC에 blob으로 받을 수 없고

파일 링크로 받게 되면 이후 수동으로 등록하는 파일과 구분되어 문제가 된다는 이야기가 나왔는데

이전 담당하던 홈페이지 이전쪽도 동일한 논의가 있어서 파일 전송 부분을 해결했었지만

협력사쪽의 편의에 의해 링크로 이전되어 사용하지 않게 된 코드를 다시 사용해봤다.

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Blob 데이터 Salesforce 업로드</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        input[type="text"], button {
            margin-bottom: 10px;
            padding: 5px;
            font-size: 16px;
        }
        #result {
            margin-top: 20px;
        }
    </style>
</head>
<body>
    <h1>Blob 데이터 Salesforce 업로드</h1>
    
    <label for="authToken">Salesforce Authorization Token:</label>
    <input type="text" id="authToken" placeholder="Authorization Token 입력" size="50">
    
    <input type="text" id="fileLink" placeholder="파일 다운로드 링크 입력" size="50">
    <button id="uploadButton">파일 업로드</button>
    
    <div id="result"></div>

    <script>
        document.getElementById('uploadButton').addEventListener('click', async () => {
            const fileLink = document.getElementById('fileLink').value;
            const authToken = document.getElementById('authToken').value;
            const resultDiv = document.getElementById('result');

            if (!fileLink || !authToken) {
                alert("파일 다운로드 링크와 Authorization Token을 입력하세요.");
                return;
            }

            try {
                // 파일 다운로드
                const response = await fetch(fileLink);

                if (!response.ok) {
                    throw new Error(`HTTP 오류: ${response.status}`);
                }

                const blob = await response.blob();
                const fileName = fileLink.split('/').pop(); // 파일명 추출
                const base64Data = await blobToBase64(blob);

                console.log('다운로드 성공! Blob:', blob);

                // Salesforce API 요청을 프록시 서버로 중계
                const salesforceResponse = await fetch('<http://localhost:3000/upload>', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify({
                        Title: fileName,
                        PathOnClient: fileName,
                        FirstPublishLocationId: "0035g000007GALTAA4",//테스트용도로 input에서 입력받아서 처리되게 수정 필요
                        VersionData: base64Data,
												Token: authToken
                    }),
                });

                if (!salesforceResponse.ok) {
                    throw new Error(`업로드 실패: ${salesforceResponse.statusText}`);
                }

                resultDiv.innerHTML = `<p>파일 업로드 성공!</p>`;
            } catch (error) {
                console.error('업로드 실패:', error.message);
                resultDiv.innerHTML = `<p style="color: red;">업로드 실패: ${error.message}</p>`;
            }
        });

        // Blob을 Base64로 변환하는 함수
        function blobToBase64(blob) {
            return new Promise((resolve, reject) => {
                const reader = new FileReader();
                reader.onloadend = () => resolve(reader.result.split(',')[1]); // Base64 데이터 반환
                reader.onerror = reject;
                reader.readAsDataURL(blob);
            });
        }
    </script>
</body>
</html>

처음에는 위 코드처럼 하지 않고 단계적으로 진행해서

파일을 blob으로 변환이 되는지 체크하고

그 다음에는 다운로드 링크 파일을 다운받아서 blob으로 변환이 되는지 확인하고

마지막으로 blob으로 변환된 내용을 sfdc 파일생성 전송이 되는지 확인했는데

이 전송 부분을 수동으로 만든 인터페이스가 아니라

https://xxxxxxx.sandbox.my.salesforce.com/services/data/v56.0/sobjects/ContentVersion 이라는

SFDC에서 기본적으로 제공하는 api를 사용해서 테스트했다.

 

하지만 다운로드 부분에서 cors가 막혔기 때문에

크롬 확장프로그램인 Allow CORS: Access-Control-Allow-origin를 사용해서 해결했지만

SFDC로 발송하는 부분은 CORS 무시가 통하지 않았기 때문에 결국 Node.JS 서버를 만들어야 했다.

 

//server.js
import express from 'express';
import bodyParser from 'body-parser';
import cors from 'cors';  // CORS 추가
import fetch from 'node-fetch'; 

const app = express();
const PORT = 3000;

app.use(cors()); //CORD 에러 해결

// 요청 크기 제한 증가시키기
app.use(bodyParser.json({ limit: '10mb' }));
app.use(bodyParser.urlencoded({ limit: '10mb', extended: true }));

app.post('/upload', async (req, res) => {
    const { Title, PathOnClient, FirstPublishLocationId, VersionData, Token } = req.body;

    try {
		        const salesforceResponse = await fetch('<https://xxxxxxx.sandbox.my.salesforce.com/services/data/v56.0/sobjects/ContentVersion>', {
            method: 'POST',
            headers: {
                'Authorization': 'Bearer ' + Token,
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                Title,
                PathOnClient,
                FirstPublishLocationId,
                VersionData,
            }),
        });

        if (!salesforceResponse.ok) {
            const errorText = await salesforceResponse.text();
            res.status(salesforceResponse.status).send(`Salesforce 오류: ${errorText}`);
            return;
        }

        res.send('업로드 성공!');
    } catch (error) {
        console.error('Salesforce 업로드 실패:', error);
        res.status(500).send('업로드 실패');
    }
});

app.listen(PORT, () => {
    console.log(`서버가 ${PORT}번 포트에서 실행 중입니다.`);
});

CORS는 서버를 통해도 되지 않아서 CORS를 import하고 use로 설정한 다음에서야 제대로 작동했고

그 이후에는 필요한 값들을 넘겨서 다운로드 링크와 토큰을 넘겨서 SFDC에 생성되는 것을 확인했다.

 

이제 다운로드링크로 마이그레이션을 진행한 레코드들을 쿼리로 모아서

Id와 다운로드 링크 리스트만 있으면 각각 인터페이스 호출을 통해서 발송할 수 있게 할 수 있을 것 같지만

이 방식대로 진행하지 않을 수도 있다고 하셔서 일단 리스트로 파일 배치 대규모 처리는 여유가 되면 해보기로 했다.

 

 

(1).백준 3049번 다각형의 대각선은 내부 점들을 이어서 교차점의 숫자를 구해야 하는 문제였다.

 

nC4를 구하라는 것과 같은 내용이며 4개가 되기 전에는 0이기 때문에

nC4를 구해준 다음 값이 1보다 작으면 0을 출력하고 아니면 계산된 결과를 출력하는 방식으로 해결했다.

const input = Number('6')
const result = input * (input - 1) * (input - 2 ) * (input - 3) / 24
console.log( result >= 1 ? result : 0)

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

[개발일지] - 556  (0) 2025.01.09
[개발일지] - 555  (0) 2025.01.08
[개발일지] - 553  (0) 2025.01.06
[개발일지] - 552(주말)  (0) 2025.01.05
[개발일지] - 551(주말)  (0) 2025.01.04

인증서 사용 여부 관련 문의가 들어왔는데

나는 등록한 적이 없긴 하지만 리로더를 통해서 tooling api? 같은 기능을 켜니

어떻게 인증서 목록 정보를 쿼리로 조회해 볼 수 있었는데

안타깝게도 인증서 관련 객체는 정보가 거의 없어서 작성자도 볼 수 없었다.

 

테스트케이스를 작성하는데 일부 레코드 타입을 가져오는 예전 코드들이 문제가 있었는데

동일 명칭의 developer name이 사용되고 있었기 때문에 발생한 에러로

결국 Name을 기준으로 쿼리하는 방식으로 레코드타입을 넣어줘서 해결할 수 있었다.

 

사실 수요일에 진행되는 회의 이후에 이런저런 수정이 반영될 것 같긴 한데

테스트클래스 작성 이후 토큰 등에 custom settings도 추가로 반영해주고

이쪽은 심적으로 신경쓰이지 않게 마무리를 빨리 하려고 하고 있다.

 

수요일에 화상으로 모여서 회의를 하기로 했는데

사실 우리쪽에서는 그냥 결과 통보 후 인터페이스만 넣으면 될 것 같은데

일단은 수요일 오전으로 확정지었고

내부에서 팀장님과 이사님이 참여가 필요한지 이야기가 나와버려서

혼자 그냥 들어가려고 하다가 이사님에게는 필요한 히스토리만 듣고

나랑 팀장님이 같이 들어가는 것으로 정리됐다.

 

신기하게 작년 5월쯤 이쪽 회사 인터페이스를 했던 부분에 대한 문의도 들어왔는데

fail로 로그가 많이 찍혀서 문의가 들어왔던 부분이지만

실제 클래스를 확인해보면 우리쪽에서 조회용 인터페이스라서

실제로 fail이 뜨는게 맞고 고객사에서 왜 실패했는지 물어볼 때

이런 내용으로 조회해서 값이 없어서 안된다고 답변해야 했기 때문에 fail 처리가 맞아서 잘 작성했다고 마무리됐다.

 

주로 담당했던 고객사쪽에서는 할인율 오류가 발생했는데

이번에는 한번도 문제가 된적도 없고 내가 확인해본적 없는 22년도 인터페이스였기 때문에

역추적에 시간이 조금 더 걸렸지만

결과적으로는 헤더(그룹) 인터페이스 후 라인(할인율)이 추가되어야 하는데

SAP쪽에서 동시다발적으로 인터페이스를 발송해버리다보니

할인율이 먼저 들어와서 헤더(그룹) 없이 추가되려고 해서 에러가 발생했고

그 이후로는 할인율은 추가되지 않아서 할인율 조회가 되지 않는 부분이었다.

 

작년 10월에 추가된 내용인데 여태 확인이 안된게 신기하긴 헀지만

그냥 로그에 찍힌 할인율 목록을 postman으로 수동 발송 한번 해서 정상화했고

해당 히스토리와 반영 내용을 고객사에 전달했다.

 

유지보수 관련 시간 정리만 해두고 등록은 따로 하지 않았는데

전체적으로 종합을 한번 해서 등록해주고

올해부터 임시 테스트기간인 내부 업무 할당 관련 내용을 작성하는데

참여하는 회사도 많지만 책임이나 업무 목록에 대해 정의되지 않은 부분들도 있어서

작성하는데 생각보다 많이 시간이 소모되어버렸다.

 

 

(1).백준 16435번 스네이크버드는 뱀이 하나씩 먹으면서 성장한다고 할 때 최대 크기를 구해야 하는 문제로

먹을 수 있는 크기는 뱀보다 작아야 했기 때문에 과일들의 크기를 정렬해준 다음

먹을 수 있을 때까지 먹게 하고 먹을 수 없는 시점에 중단해서 최종 크기를 출력하는 방식으로 해결했다.

const input = `9 1
9 5 8 1 3 2 7 6 4`.split('\n').map(el => el.split(' ').map(Number))

let [listLength, snake] = input[0]
const fruit = input[1].sort((a,b) => a-b)

for(let i = 0  ; i < fruit.length ; i++){
    if(snake >= fruit[i]){
        snake++
    }
    else{
        break
    }
}

console.log(snake)

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

[개발일지] - 555  (0) 2025.01.08
[개발일지] - 554  (0) 2025.01.07
[개발일지] - 552(주말)  (0) 2025.01.05
[개발일지] - 551(주말)  (0) 2025.01.04
[개발일지] - 550  (1) 2025.01.03

(1).백준 2822번 점수 계산은 최고 점수 5명의 합과 해당 인원들을 오름차순으로 출력해야 하는 문제였다.

 

정렬하기 전 참가자의 위치를 알기 위해서 점수를 배열로 변경해서 index값을 추가해줬고

점수를 기준으로 정렬해 5명의 점수를 합하고 배열에 해당 index를 담아준 다음

최종적으로 점수와 indexList의 정렬 후 양식에 맞게 변경된 내용을 같이 출력했다.

const input = `20
30
50
48
33
66
0
64`.split('\n').map(Number)

const resultArr = []
let sum = 0

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

input.sort((a,b) => b[0] - a[0])

for(let i = 0 ; i < 5 ; i++){
    sum += input[i][0]
    resultArr.push(input[i][1])
}

console.log(sum)
console.log(resultArr.sort((a,b) => a - b).join(' '))

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

[개발일지] - 554  (0) 2025.01.07
[개발일지] - 553  (0) 2025.01.06
[개발일지] - 551(주말)  (0) 2025.01.04
[개발일지] - 550  (1) 2025.01.03
[개발일지] - 549(연차)  (0) 2025.01.02

(1).백준 2535번 아시아 정보올림피아드는 각국의 대표들이 모였을 때 금, 은, 동메달을 출력해야 하는 문제였다.

 

다만 국가당 최대 2명만 상을 받을 수 있다고 하는데

상을 3명이 받을 수 있는 경우는 금, 은, 동이 모두 포함되어야 하기 때문에 1,2등과 3등이 같은 경우만 체크하면 됐고

일단 점수 순으로 정렬해서 1, 2등을 미리 넣어준 다음

3등을 넣을 때 1, 2등과 같은 국가면 다음 사람으로 넘어가는 방식으로 해결했다.

const input = `9
1 1 230
1 2 210
1 3 205
2 1 100
2 2 150
3 1 175
3 2 190
3 3 180
3 4 195`.split('\n').map(el => el.split(' ').map(Number))
input.shift()
input.sort((a, b) => b[2] - a[2])
input.forEach(el => el.pop())
const result = [input[0].join(' '), input[1].join(' ')]

for(let i = 2 ; i < input.length ; i++){
    if(input[0][0] != input[1][0] || input[0][0] != input[i][0]){
        result.push(input[i].join(' '))
        break
    }
}
console.log(result.join('\n'))

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

[개발일지] - 553  (0) 2025.01.06
[개발일지] - 552(주말)  (0) 2025.01.05
[개발일지] - 550  (1) 2025.01.03
[개발일지] - 549(연차)  (0) 2025.01.02
[개발일지] - 548(신정)  (0) 2025.01.01

휴가 중 문의가 들어온 내용이 있었는데

어드민쪽 처리 내용으로 보이지만 해보려고 하다가 설정 부분에 대해 확신이 없었는데

인증을 삭제하고 다시 부여하는게 재발송이 되는건지 문의를 하려고 전송했는데

다행히 어제 이미 다 처리된 내용이라는 답변을 받았다.

 

커머스 클라우드 관련해서 개발서버 인터페이스 에러 로직 확인 요청을 받았는데

일단 에러가 발생한 로그는 확인되었지만 처음보는 특이한 에러였고

디버그를 찍어서 다시 해당 작업을 반복해보니 503 서버 에러임을 확인할 수 있었다.

 

하이퍼클라우드 변경으로 인한 방화벽 문제일 가능성이 20%

그 외에 서버가 일시적으로 닫히거나 문제가 발생했을 가능성을 80%로 봤는데

일단 하이퍼클라우드 적용되지 않았기 때문에 SAP쪽에 문의 메일을 발송했고

27일부터 고객사의 요청으로 개발서버쪽 SAP이 닫혔다는 답변을 받았다.

 

이후 다른 회사의 자동화 처리를 진행하는데

트리거 기준 및 발송 인터페이스 수정 요청들이 저번 회의에서 문의가 왔고

그 세부사항을 바로 전 영업일 오후에 받았었기 때문에 오전에 반영했다.

 

오후에 6가지 요청 및 확인사항등에 대한 리스트를 정리하던 중 갑자기 잡힌 2시 회의에 참여했고

대부분 인터페이스와 큰 관련이 있는지 잠깐씩 의문이 들긴 했는데

PM과 개발자와 인터페이스 그 어딘가에 있는 역할 느낌으로 정의서를 우리쪽에서 만들어야 하나 의아했다.

 

이후 리스트 관련 메일을 다시 정리한 다음 발송했고

테스트클래스를 작성하려고 하다가 하드코딩으로 빠르게 완성했던 부분을

먼저 Custom Settings를 적용해서 개발, 운영에 반영될 수 있도록 적용했다.

 

퇴근시간이 되어서 퇴근하려고 했었는데

몇주 같이 야근하던 분이 저녁을 먹자고 하셔서 어차피 일은 계속 쌓여있기 때문에

결국 또 야근을 하게 됐고 테스트클래스들을 작성하다가 9시가 넘어서 퇴근할 수 있었다.

 

 

(1).백준 1439번 뒤집기는 0 또는 1을 뒤집어서 하나로 만들어야 한다는 문제였는데

같은 덩어리들로 묶어서 한번에 뒤집을 수 있기 때문에 연속된 숫자는 없는 것으로 봐도 될 것 같아서 제외했고

결국 10은 1회, 101도 1회 등 달라진 횟수 /2를 올린 값을 사용하기 때문에

변경 횟수를 change 변수에 담아서 전체 변경 횟수를 계산한 다음 Math.round로 반올림(0.5라 무조건 올림) 처리해서 출력했다.

const input = `11101101`
let change = 0
let now = input[0]

for(let i = 1 ; i < input.length ; i++){
    if(input[i] != now){
        now = input[i]
        change++
    }
}

console.log(Math.round(change / 2))

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

[개발일지] - 552(주말)  (0) 2025.01.05
[개발일지] - 551(주말)  (0) 2025.01.04
[개발일지] - 549(연차)  (0) 2025.01.02
[개발일지] - 548(신정)  (0) 2025.01.01
[개발일지] - 547  (0) 2024.12.31

(1).백준 1673번 치킨 쿠폰은 일정 숫자의 치킨을 시킬 수 있을 때

치킨 쿠폰을 받아서 최대 치킨을 몇번 주문할 수 있는지를 각각 출력해야 하는 문제였다.

 

치킨을 시킬 때마다 쿠폰이 발생하기 때문에 기록한 다음

쿠폰이 주문 가능한 수치 이상일 경우 while문에서 치킨을 주문하고 남은 쿠폰을 더하는 방식으로 처리했다.

const input = `4 3
10 3
100 5`.split('\n')

const result = []

for(let i = 0 ; i < input.length ; i++){
    const [n, k] = input[i].split(' ').map(Number)
    let sum = n
    let coupon = n
    while(coupon >= k){
        const chicken = Math.floor(coupon / k)
        sum += chicken
        coupon = coupon % k
        coupon += chicken
    }
    result.push(sum)
}

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

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

[개발일지] - 551(주말)  (0) 2025.01.04
[개발일지] - 550  (1) 2025.01.03
[개발일지] - 548(신정)  (0) 2025.01.01
[개발일지] - 547  (0) 2024.12.31
[개발일지] - 546  (1) 2024.12.30

(1).백준 18406번 럭키 스트레이트는 앞 뒤로 반 자른 숫자의 합이 같을 경우 기술을 사용할 수 있다는 조건으로

for문을 순회하며 절반까지는 더하고 나머지는 빼는 방식으로 합을 구해준 다음

합이 0이면 동일한 합을 가졌다고 판단하고 삼항연산자로 LUCKY, READY를 출력하는 방식으로 해결했다.

const input = `7755`.split('')

let sum = 0

for(let i = 0 ; i < input.length ; i++){
    if(i < input.length / 2){
        sum += Number(input[i])
    }
    else{
        sum -= Number(input[i])
    }
}

console.log(sum == 0 ? 'LUCKY' : 'READY')

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

[개발일지] - 550  (1) 2025.01.03
[개발일지] - 549(연차)  (0) 2025.01.02
[개발일지] - 547  (0) 2024.12.31
[개발일지] - 546  (1) 2024.12.30
[개발일지] - 545(주말)  (0) 2024.12.29

진행했던 주 고객사 관련 케이스를 등록하고

회사 내부적으로 추가된 시스템을 확인했는데

내년부터 적용하겠다고 하지만 공지가 미리 올라와서 확인했지만 뭔가 애매했다.

 

홈에 자세한 설명이 있다고 했는데 해당 내용을 찾을 수 없었고

중간에 로그 확인 요청이 와서 중단하고 해당 작업을 먼저 처리했고

중간에 수식 정리 관련 문의도 들어와서 엑셀을 오랜만에 봤는데

다행히 concat이라는 함수가 엑셀에도 존재해서 정상적으로 처리되는 것을 볼 수 있었다.

 

리드 처리 방식에 대해 고객사쪽 문의인건지 문의가 전달되었고

사용자 정보 동의? 관련 무슨 칸에 대해 처리가 어떻게 되는지 문의가 왔지만

애초에 처음 정의서를 받았을 때부터 그런 필드 자체가 없었기 때문에 처리되지 않았고

해당 내용을 전달한 상태에서 다시 생각해보면 다른 회사에서는 동의가 되면 전달하기 때문에

이번 인터페이스의 경우에 그냥 전달되면 동의되었다고 처리하는 방법도 있을 것 같고

그쪽에서 희망하면 전달 여부 필드를 추가하는 방법도 있을 것 같아서 해당 내용을 다시 정리해서 전달했다.

 

최근 진행된 실시간 테스트 관련해서 장문의 답장이 넘어왔는데

거기에 대해서 하나씩 답변을 달고 로직을 확인하다보니 퇴근시간이 지나버렸고

애초에 연말에 보낸다고 의미가 있는 내용도 아니고

검토해야 할 내용도 추가적으로 많이 있는 상황이기 때문에 내년에 처리하기로 했다.

 

 

(1).백준 13300번 방 배정은 학년, 성별별로 방을 나누고

각 방마다 최대 인원 제한이 존재할 때 최소 몇개의 방이 필요한지 계산해야 하는 문제였다.

 

각 학년과 성별을 하나의 index에 담는 방식으로 구분해서 카운팅했고

각각의 학생들이 담긴 리스트를 순회하며 방에 들어갈 수 있는 인원으로 나눈 올림값을 결과에 합해서 출력했다.

const input = `3 3
0 3
1 5
0 6`.split('\n').map(el => el.split(' ').map(Number))

const [studentNum, roomSize] = input[0]
const studentList = new Array(12).fill(0)
let result = 0

for(let i = 1 ; i < input.length ; i++){
    const [gender, grade] = input[i]
    studentList[(grade - 1) * 2 + gender]++
}

for(let i = 0 ; i < studentList.length ; i++){
    result += Math.ceil(studentList[i] / roomSize)
}

console.log(result)

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

[개발일지] - 549(연차)  (0) 2025.01.02
[개발일지] - 548(신정)  (0) 2025.01.01
[개발일지] - 546  (1) 2024.12.30
[개발일지] - 545(주말)  (0) 2024.12.29
[개발일지] - 544(주말)  (0) 2024.12.28

+ Recent posts