
강의 영상 보는게 늦어져서 금요일 저녁쯤이나 되서야 제대로 시작할 수 있었다.
당장 월요일 제출이라 시간이 촉박하긴 했지만 클라이언트 코드도 주어지고 기본적인 코드 또한 강의로 주어지니 괜찮을 거라 생각하고 진행했다.
하지만
생각지도 못한곳에서 문제가 생겨버렸다...
해당 문제 코드
Assets.js라는 파일을 만들어서 데이터 테이블을 가져와서 stage.json의 데이터를 이용해 스테이지를 구분하고, 스테이지별 점수 획득을 구현하려고 했는데 위의 사진처럼 with를 썻더니 strict모드에서는 with를 사용할 수 없다고해서 찾아보니 strict모드를 사용하지 않아야한다고하는데 package.json에서 사용한 module의 특징이 strict모드로 동작하는 거고...그래서 with를 사용하지 않고 assert를 써봤더니
assert는 지원되지 않는다하고.. 뒷내용을 다빼고 실행해봤더니
읽어오지를 못했다.
해결법을 찾아보고 오기가 생겨서 문제를 풀어보려고 해도 다 그냥 with { type : 'json'}을 사용하면 된다고만 하고 다른 근본적인 방법이 없었다..
다른 방식으로 해보자니 시간이 촉박할거 같고 해서 일단은 된다고 가정하고 필수 기능부터 구현한 후 되는 방식으로 바꿔보자라는 생각이 들어 일단 필수 기능을 먼저 구현해봤다.
※ 오류로 실패한 코드이지만 위의 Assets.js가 오류가 없다는 가정하에 진행했습니다..
강의의 실습에서 점수에 따라 스테이지가 바뀔 수 있게 하드코딩을 했었다.
Score.js
// 점수가 100점 이상이 될 시 서버에 메세지 전송
if (Math.floor(this.score) === 100 && this.stageChange) {
this.stageChange = false;
sendEvent(11, { currentStage: 1000, targetStage: 1001 });
}
해당 방식대로라면 this.score값과 비교하는 숫자와 이벤트의 id값을 데이터 테이블에서 가져온 값으로 바꿔주면 다음 스테이지로 이동하는 부분을 만들 수 있을 거같아 작성해봤다.
score.js
stage.handler.js
stage.json 데이터 테이블에 scorePerSecond를 추가해 기존 스테이지 점수 획득 방식에 해당 값을 가져와 사용했다.
this.score += deltaTime*0.001*Data.stage.data[this.currentStage].scorePerSecond;
아이템 언락 테이블
{
"name": "item_unlock",
"version": "1.0.0",
"data": [
{ "id": 100, "stage_id": 1000, "item_id": 1 },
{ "id": 101, "stage_id": 1001, "item_id": 2 },
{ "id": 102, "stage_id": 1002, "item_id": 3 },
{ "id": 103, "stage_id": 1003, "item_id": 4 },
{ "id": 104, "stage_id": 1004, "item_id": 5 },
{ "id": 105, "stage_id": 1005, "item_id": 6 }
]
}
각 스테이지 별로 아이템 id에 맞는 각각 다른 아이템이 나오게 만들었다.
ItemController.js
스테이지 이동시 점수 획득과 비슷한 방식으로 아이템 획득시 12번 이벤트를 통해 점수를 획득하게 만들었다.
score.js
해당 스테이지에 나오는아이템인지, 맞는 점수인지 검증을 통해 해당부분을 만들었다.
item.hadler.js
오류투성이에 엉망진창인 코드겠지만...다시 열심히 구현해봐야겠다..
휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀝니다.
예를 들어, 1번 키에 "A", "B", "C" 순서대로 문자가 할당되어 있다면 1번 키를 한 번 누르면 "A", 두 번 누르면 "B", 세 번 누르면 "C"가 되는 식입니다.
같은 규칙을 적용해 아무렇게나 만든 휴대폰 자판이 있습니다. 이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 특정 키를 눌렀을 때 입력되는 문자들도 무작위로 배열되어 있습니다. 또, 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 키 하나에 같은 문자가 여러 번 할당된 경우도 있습니다. 심지어 아예 할당되지 않은 경우도 있습니다. 따라서 몇몇 문자열은 작성할 수 없을 수도 있습니다.
이 휴대폰 자판을 이용해 특정 문자열을 작성할 때, 키를 최소 몇 번 눌러야 그 문자열을 작성할 수 있는지 알아보고자 합니다.
1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어질 때, 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return 하는 solution 함수를 완성해 주세요.
단, 목표 문자열을 작성할 수 없을 때는 -1을 저장합니다.
1 ≤ keymap의 길이 ≤ 100
1 ≤ keymap의 원소의 길이 ≤ 100
keymap[i]는 i + 1번 키를 눌렀을 때 순서대로 바뀌는 문자를 의미합니다.
예를 들어 keymap[0] = "ABACD" 인 경우 1번 키를 한 번 누르면 A, 두 번 누르면 B, 세 번 누르면 A 가 됩니다.
keymap의 원소의 길이는 서로 다를 수 있습니다.
keymap의 원소는 알파벳 대문자로만 이루어져 있습니다.
1 ≤ targets의 길이 ≤ 100
1 ≤ targets의 원소의 길이 ≤ 100
targets의 원소는 알파벳 대문자로만 이루어져 있습니다.
function solution(keymap, targets) {
const map = new Map();
var answer = [];
for(i = 0 ; i < keymap.length ; i++) {
for(j = 0 ; j < keymap[i].length ; j++) {
if(!map.has(keymap[i][j])) {
map.set(keymap[i][j] , j+1);
}
else {
map.set(keymap[i][j] , j < map.get(keymap[i][j]) ? j+1 : map.get(keymap[i][j]));
}
}
}
for(i = 0 ; i<targets.length ; i++) {
var result = 0;
for(j = 0 ; j < targets[i].length ; j++) {
if(!map.has(targets[i][j]) ) {
result = -1;
break;
}
else {
result += map.get(targets[i][j]);
}
}
answer.push(result);
}
return answer
}
keymap이 주어지는데 최소한의 버튼을 눌러서 타겟값을 만들고 싶고 타겟값을 못 만드는 경우에는 -1을 리턴해야함. => 타겟값이 원하는 알파벳이 keymap에 있는지 확인하고 해당 알파벳까지 접근할 최단 거리를 알아야함.
keymap을 순회해서 한번도 만나지않은 key이면 인덱스기준으로 매핑해줌. => 이미 존재하는 키값이라면 현재 인덱스와 이전의 인덱스 값을 비교해서 더 작은값으로 업데이트 해줌. => 이후 targets배열을 순회해서 has를 통해 키값이 없으면 -1을 리턴후 반복문 종료. => 만약 키값이 매치되면 키값을 result에 더해줌.
배열을 순회해서 각 요소를 콜백 함수로 적용해서 처리해 모은 새로운 배열을 반환하기 위한 함수. => 원본 배열은 변경하지 않으면서 해당 배열 요소에 대한 규칙적인 새로운 배열 요소를 생성할 때 사용.
예제
const numbers = [1, 2, 3, 4, 5]; const doubledNumbers = numbers.map(function(number) { return number * 2; // 매핑된 결과를 새로운 배열로 반환 }); console.log(doubledNumbers); // 출력: [2, 4, 6, 8, 10]