일기

12/5

Realuda72 2024. 12. 5. 21:41

오늘 한 일


코딩테스트 연습

 

덧칠하기(https://school.programmers.co.kr/learn/courses/30/lessons/161989)

function solution(n, m, section) {
    var answer = 0;
    var wall = new Array(n);
    for(e of section){
        wall[e-1] = 1;
    }
    for(i = 0; i < wall.length; i++){
        if(wall[i] === 1){
            for(x = i; x < i + m; x++){
                wall[x] = 0;
            }
            answer++;
        }
    }
    return answer;
}

1. 주어진 section을 바탕으로 wall 배열을 생성한다.

2. wall 배열을 순회하면서 왼쪽에서부터 벽을 칠한다.

3. 칠한 횟수를 더해 반환한다.

 

중간에 for문에서 i+m을 i+4로 적어서 좀 고생했다.

예시 문제에서 m값이 4라서 무심코 그렇게 했다.

 

기사단원의 무기(https://school.programmers.co.kr/learn/courses/30/lessons/136798)

function solution(number, limit, power) {
    var answer = 0;
    for(i = 1; i <= number; i++){
        var n = foo(i);
        n > limit ? answer += power : answer += n;
    }
    
    function foo(n){
        var cnt = 0;
        for(j = 1; j <= Math.sqrt(n); j++){
            if(n % j === 0){
                cnt++;
                if(n / j !== j) cnt++;
            }
        }
        return cnt;
    }
    return answer;
}

1. 기사단원들을 순회하며 약수의 갯수를 구한다.

2. 약수의 갯수가 limit보다 크면 power를, 아니라면 약수의 갯수를 answer에 더한다.

 

로또의 최고 순위와 최저 순위(https://school.programmers.co.kr/learn/courses/30/lessons/77484)

function solution(lottos, win_nums) {
    var answer = [];
    var zeros = 0;
    var win = 0;
    for(e of lottos){
        if(e === 0) zeros++;
        if(win_nums.find((el) => el === e)){
            win++;
        }
    }
    answer.push(Math.min(7- (win + zeros), 6));
    answer.push(Math.min(7- win, 6));
    return answer;
}

1. 확실하게 당첨된 숫자의 갯수를 구한다.

2. 불확실한 숫자의 갯수를 구한다.

3. 불확실한 숫자가 모두 당첨이라면 최고 순위, 꽝이라면 최저 순위이다.


프로젝트에서 선수 목록을 조회할 때 선수의 평균 스탯을 표시해달라는 요청을 받았다.

const player = await prisma.players.findUnique({
        where: { player_id: +playerId },
        select: {
            player_name: true,
            _avg:{
                player_speed: true,
                player_finish: true,
                player_power: true,
                player_defense: true,
                player_stamina: true,
            }
        }
    })

이렇게 하면 되지 않을까? 했는데 안됐다.

 

const player = await prisma.players.findUnique({
        where: { player_id: +playerId },
        select: {
            player_name: true,
            (player_speed+player_finish+player_power+player_defense+player_stamina)/5:true,
        }
    })

이렇게 하면 되지 않을까? 했는데 안됐다.

 

https://www.prisma.io/docs/orm/prisma-client/queries/aggregation-grouping-summarizing

 

Aggregation, grouping, and summarizing (Concepts) | Prisma Documentation

Use Prisma Client to aggregate, group by, count, and select distinct.

www.prisma.io

프리즈마의 aggregate함수를 써야 평균 값을 구할 수 있었다.

근데 이건 여러 항목들의 평균값을 구하는거지, 여러 colomn의 평균을 구하는게 아니라서 나가리.

 

결국 플레이어의 모든 스탯을 불러오고, js로 평균값을 구해서 데이터를 변형하기로 했다.

 

// 선수 목록 조회
router.get('/players', async (req, res, next) => {
    const players = await prisma.players.findMany({
        select: {
            player_name: true,
            player_speed: true,
            player_finish: true,
            player_power: true,
            player_defense: true,
            player_stamina: true,
        }
    })

    const converted = players.map(player => {
        const average = (player.player_speed + player.player_finish + player.player_power + player.player_defense + player.player_stamina) / 5;
        return {
            name: player.player_name,
            player_average: average
        };
    })

    return res.status(200).json({ players: converted });
});

일단 선수 정보를 능력치까지 모두 불러온다.

불러온 객체를 순회하며 각 플레이어의 능력치 평균값을 구하고 이름과 능력치 평균값을 가지는 객체를 반환한다.

(사실 이렇게 할거면 그냥 전체 능력치도 같이 보여주면 안되나 싶긴 하다.)

 

// 선수 상세 조회
router.get('/players/:playerId', async (req, res, next) => {
    const { playerId } = req.params;

    const player = await prisma.players.findUnique({
        where: { player_id: +playerId },
        select: {
            player_name: true,
            player_speed: true,
            player_finish: true,
            player_power: true,
            player_defense: true,
            player_stamina: true,
        }
    })
    if (!player) {
        return res.status(404).json({ msg: '존재하지 않는 선수입니다.' });
    }

    const average = (player.player_speed + player.player_finish + player.player_power + player.player_defense + player.player_stamina) / 5;
    player.player_average = average;

    return res.status(200).json({ players: player });
})

선수 정보 상세 조회도 마찬가지로 플레이어를 찾고, 능력치 평균값을 선수 정보 객체에 추가한다.