12/5
오늘 한 일
코딩테스트 연습
덧칠하기(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 });
})
선수 정보 상세 조회도 마찬가지로 플레이어를 찾고, 능력치 평균값을 선수 정보 객체에 추가한다.
끗