오늘의 목표
✔️ 프로그래머스 코테 문제 풀기
✔️ 개인프로젝트 진행
⏱️ 오늘의 일정
프로그래머스 코테 문제 풀기개인프로젝트 진행
📜 프로그래머스 코테 문제 풀기
의상
AlgorithmCodingTest/프로그래머스/2/42578. 의상 at main · YamSaeng/AlgorithmCodingTest
This is an auto push repository for Baekjoon Online Judge created with [BaekjoonHub](https://github.com/BaekjoonHub/BaekjoonHub). - YamSaeng/AlgorithmCodingTest
github.com
객체( map 구조 )를 이용해 푸니 쉽게 풀 수 있었다.
function solution(clothes) {
const clothesMap = {};
let answer = 1;
clothes.forEach(cloth => {
const [type, name] = cloth;
if(clothesMap.hasOwnProperty(name)) {
clothesMap[name]++;
}
else {
clothesMap[name] = 1;
}
})
for(const key in clothesMap) {
answer *= (clothesMap[key] + 1);
}
return answer - 1;
}
📜 개인프로젝트 진행
더미의 개수를 늘려 서버 과부하 테스트를 진행해봤다.
100, 200, 300, 400 명까지는 서버에서 감당을 하는데, 500명 정도 되니 렉이 걸려 버벅이는것이 느껴질 정도였다.
아래 함수 DummyclientCreate는 매개변수로 수를 받아 해당 수만큼 더미를 생성하고 접속하는 역할을 담당한다.
async function DummyClientCreate(count: number) {
for (let i = 0; i < count; i++) {
const dummyClient = new Client();
DummyClients.push(dummyClient);
dummyClient.Connect();
await delay(100);
}
}
delay는 말그대로 서버 접속 할때 일정 시간 텀을 두고 connect를 할 수 있도록 만든 함수다.
이해가 안되는 부분이 하나가 있는데, 우회하는 방식으로 해결을 했다.
내용은 다음과 같다.
클라의 수가 200명이 넘어가면, 유니티로 접속하고 유니티 클라를 종료해도
서버의 OnEnd가 작동하지 않는 문제가 생겼다.
신기하게도 100명 정도에서는 문제 없이 OnEnd가 작동을 하는데, 200이 넘어가면 OnEnd가 작동을 하지 않으니
당최 이해를 할 수가 없었다.. ㅠㅠ
구글링을 찾아봐도 도저히 답이 안나와서 PingPacket을 이용해 접속끊긴 대상을 탐지하는 방식으로 우회해 해결했다.
User는 pongCount라는 변수를 가진다.
pongCount는 서버에서 pingPacket을 User에게 보낼때마다 1씩 증가한다. ( 1초에 1씩 늘어남 )
클라가 pingPacket을 받아서 서버로 pongPacket을 보내면 해당 User의 pongCount를 0으로 초기화한다.
위와 같이 로직을 구성했을 때, 만약 해당 유저가 접속이 끊긴 것이라면, pongCount는 0으로 초기화 되지 않고,
누적해서 계속 쌓이게 된다. 이 점을 이용해서 일정 숫자 이상이 되면 해당 유저는 접속이 끊긴 것이라고 판단하고,
접속을 끊는다.
if (user.pongCount >= config.gameserver.pongCount) {
user.GetSocket().end();
OnEnd(user.GetSocket());
}
이처럼 구성을 하니 OnEnd가 작동하지 않더라도 접속 끊긴 대상을 탐지 할 수 있게 되었다.
위 코드처럼 서버에서 대상을 끊게되니,
이미 끊은 대상에 대해 패킷을 전송하는 경우가 생기게 되었다.
if(locationUpdateUser.pongCount < config.gameserver.pongCount)
{
socket.write(usersLocationPacket);
}
따라서 위 코드처럼 패킷을 클라에게 전송하기 전에 해당 유저의 pongCount가 최대 pongCount를 넘겼는지 확인하고,
데이터를 보내주는 방식으로 해결했다.