
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
전체 학생의 수는 2명 이상 30명 이하입니다.
체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
function solution(n, lost, reserve) {
var realLost = lost.filter(v => !reserve.includes(v)).sort((a, b) => a - b);
var realReserve = reserve.filter(r => !lost.includes(r)).sort((a, b) => a - b);
var answer = n - realLost.length;
for(i = 0; i < realLost.length; i++){
for(j = 0; j < realReserve.length; j++){
if(realReserve[j] === realLost[i] - 1 || realReserve[j] === realLost[i] + 1){
answer += 1;
realReserve[j] = -1;
break;
}
}
}
return answer;
}
여벌없이 체육복을 분실한 학생의 번호를 담은 realLost와 분실없이 여벌 체육복을 가진 학생의 번호를 담은 realReserve배열을 만듦.(lost나 reserve값이 정렬이 되지 않은 경우를 생각해서 오름차순 정렬을 해줌.) => answer = 체육수업에 참여할 수 있는 학생의 수이므로 전체 학생의 수 - 여벌없이 체육복을 분실한 학생수(n-realLost.length)
realLost의 수만큼 반복하는 반복문을 통해 realLost의 i번째 값보다 1크거나 1작은 값이 realReserve에 존재하면 answer값을 1추가하고 realReserve에서 그 값을 제거해줌.
사이드뷰, 점핑 액션 게임
#으로 시작하는 것은 기획 관리용 이름
{ "name": "stage", // 테이블 이름 "version": "1.0.0", // 테이블 버전 "data": [ { "id": 1000, "score": 0 }, { "id": 1001, "score": 100 }, { "id": 1002, "score": 200 }, { "id": 1003, "score": 300 }, { "id": 1004, "score": 400 }, { "id": 1005, "score": 500 }, { "id": 1006, "score": 600 } ] }
2) 아이템
{ "name": "item", "version": "1.0.0", "data": [ { "id": 1, "score": 10 }, { "id": 2, "score": 20 }, { "id": 3, "score": 30 }, { "id": 4, "score": 40 }, { "id": 5, "score": 50 }, { "id": 6, "score": 60 } ] }
3) 아이템해금
{ "name": "item_unlock", "version": "1.0.0", "data": [ { "id": 101, "stage_id": 1001, "item_id": 1 }, { "id": 201, "stage_id": 1002, "item_id": 2 } ] }
1) 공통 부분
2) 요청
{
handlerId: 0,
userId: 0,
clientVersion: "1.0.0",
payload: {},
}{
// 공통 부분
handlerId: 0,
userId: 0,
clientVersion: "1.0.0",
payload: {
// 스테이지 정보
currentStage: 0,
targetStage: 0,
}
}{
// 공통 부분
handlerId: 0,
userId: 0,
clientVersion: "1.0.0",
payload: {
// 아이템 정보
itemId: 0,
}
}3) 응답
{
"status": "success",
}
fs(파일시스템)를 사용해 서버에서 필요한 데이터 테이블을 메모리에 로드할 수 있다.
file로 관리
DB로 관리
CDN으로 관리
파일을 CDN에 업로드, 요청에 따라 CDN에서 파일을 읽어옴
클라이언트에서 필요한 데이터와 서버에서 필요한 데이터가 다르기 때문에 여러가지 방법을 이용해서 데이터 테이블을 관리함.(한가지만 사용하는게 아님.)
유저 모델을 통해 접속한 유저들의 정보를 메모리에 저장할 수 있다.
유저가 서버에 웹소켓이란 프로토콜을 통해 접속을 하게 되면 socketId라는게 발급됨.
uuid - 서버에서 우리가 임의로 발급해 줄 ID
socketId - 현재 유저가 서버에 접속해있다는 상태를 저장하기 위해 같은 소켓으로 계속 데이터 교환을 할 것 인데 해당 값을 저장하기위해 존재.
서버에서 유저를 위한 데이터를 생성해 저장할 수 있다.
기획한 컨텐츠를 처리하기 위한 이벤트 핸들러를 만들 수 있다.
각 핸들러에 고유 ID를 부여해 호출하는 기법
이번 모의 면접의 경우에는 면접 질문 리스트가 미리 나와있어서 준비하기가 편했다.
1) 면접관님이 주신 링크를 통해 이번 모의면접의 주제를 다시 공부한다.
2) 꼬리 질문에 대한 부분을 제대로 대답하지 못한 부분이 많으므로 면접 준비시 이런 질문이 나오면 연관 질문으로 어떤 질문을 더 주실까 하는 부분에 대해 더 생각해보고 준비한다.