와 처음에 보고 이해가 안가서 고민을 좀 많이 했는데, 저 order로 주어진걸 1,2,3,4,5 순으로 넣다 뺐다 해서 구하라는건 줄 알았으나, 그게 아닌 1,2,3,4,5 순으로 상자가 컨베이어 벨트에 올려져있고, ORDER [4,3,1,2,5] 이면 4번 상자가 첫번째로
트럭에 실려야 한다는 내용이다. 스택을 이용하여 문제를 풀면 된다.
function solution(order) {
let stack = [];
let answer = 0;
let currentBox = 1; // 박스 번호
for(let i=0; i<order.length; i++){
let target = order[i]; // 타겟 박스 번호
// 타겟 박스번호까지 스택에 푸쉬
while(currentBox <= target){
stack.push(currentBox);
currentBox++;
}
// 만약 타겟과 스택의 마지막이 같을 경우 POP 후 answer 증가
if(order[i] === stack[stack.length-1]){
stack.pop();
answer++;
}else{
break
}
}
return answer;
}
git checkout -p 가져올 브랜치 이름 -- 가져올 특정파일 경로
작업중인 브랜치(A)에서 B 브랜치의 특정 파일을 가지고 오고 싶을 때 위 명령어를 입력하면 된다.
그러면 사진처럼 뿅~ 하고 변경 내역을 물어보고 y를 입력해주면 가져올 수 있다.
import { createScore, getScore, setScore } from '../models/score.model';
/**
* 스코어 최초 초기화
*
*
* @param {string} uuid uuid(userId)
* @returns {Object} 성공 여부를 알리는 상태와 메세지
*/
export const initScore = (uuid) => {
try {
const initResult = createScore(uuid);
if (initResult.status !== 'success') throw new Error(initResult.message);
return { status: initResult.status, message: 'Successfully initialized Score' };
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
/**
* DB에 저장된 스코어 불러와서 반환해주는 함수 (클라이언트용)
*
*
* @param {string} uuid uuid(userId)
* @returns {Object} 성공 여부를 알리는 상태와 메세지, highScore
*/
export const getHighScore = (uuid) => {
try {
//INCOMPLETE: DB 구성 완료되면 구현가능
const fetchedScore = 0; // 해당 위치에 db에 저장된 score 불러옴
if (fetchedScore === undefined || !fetchedScore) throw new Error('Failed to fetch DB Score');
return {
status: 'success',
message: 'Successfully retrieved db score',
highScore: fetchedScore,
};
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
/**
* 현재 점수 불러오는 함수 (클라이언트용)
*
*
* @param {string} uuid uuid(userId)
* @returns {Object} 성공 여부를 알리는 상태와 메세지,currentScore
*/
export const getCurrentScore = (uuid) => {
try {
const currentScore = getScore(uuid);
if (!currentScore) throw new Error('Failed to retrieved score');
return { status: 'success', message: 'Successfully retrieved current score', currentScore };
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
/**
* 점수 증가 함수 (인자에 추가시킬 점수만 넣으면 됨)
*
*
* @param {string} uuid uuid(userId)
* @returns {Object} 성공 여부를 알리는 상태와 메세지
*/
export const updateIncreaseScore = (uuid, increaseScore) => {
try {
const currentScore = getScore(uuid);
if (!currentScore) throw new Error('Failed to retrieved score');
const updateScore = currentScore + Number(increaseScore);
if (updateScore < 0) throw new Error('Score is less than 0');
const setScoreResult = setScore(uuid, updateScore);
if (setScoreResult.status !== 'success') throw new Error('Failed to set score');
return { status: setScoreResult.status, message: setScoreResult.message };
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
/**
* db에 최고 점수 기록용
*
*
* @param {string} uuid uuid(userId)
* @returns {Object} 성공 여부를 알리는 상태와 메세지
*/
export const saveHighScore = (uuid, score) => {
try {
const currentScore = getScore(uuid);
if (!currentScore) throw new Error('Failed to retrieved score');
const currentHighScore = getHighScore(uuid);
if (!currentHighScore) throw new Error('Failed to retrieved high score');
const highScore = Math.max(currentScore, currentHighScore.highScore);
if (isNaN(highScore)) throw new Error('Failed to update high score');
//INCOMPLETE: DB 구성 완료되면 구현가능
// db 처리(highScore 넘김)
const dbResult = { status: 'success', message: 'Successfully updated high score' }; // 해당 위치에 db에 저장된 결과 불러옴
return { status: dbResult.status, message: dbResult.message };
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
export const stageStart = (uuid) => {
// 기본 틀만 구성, 아직 미완성
try {
// INCOMPLETE : 해당 위치 스테이지에 따른 몬스터 큐 함수 추가해야 함.
/* const currentStage = getStage(uuid);
const monsterSpawnResult = monsterSpawn(currentStage)
if(monsterSpawnResult.status === 'success'){
startStageTime = Date.now();
return { status: 'success', message: 'Successfully stage started' };
}
*/
return { status: 'success', message: 'Successfully stage started' };
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
export const stageEnd = (uuid) => {
// 기본 틀만 구성, 아직 미완성
try {
endStageTime = Date.now();
// INCOMPLETE : 현재 스테이지 몬스터 정보 날림 추가해야 함
// INCOMPLETE : endStageTime - startStageTime 으로 점수검증 추가해야 함
const result = moveToNextStage(uuid);
if (result.status === 'fail') return { status: 'fail', message: 'Last_Stage' };
return { status: 'success', message: 'Successfully stage ended' };
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
};
import { createAccount, deleteAccount } from '../models/account.model.js';
import { initializeStage } from './stage.handler.js';
import { getCurrentScore, saveHighScore, initScore } from './score.handler.js';
import { deleteStage } from '../models/stage.model.js';
import { deleteScore } from '../models/score.model.js';
export const gameStart = (uuid) => {
try {
// 초기화 진행
initializeStage(uuid);
createAccount(uuid);
initScore(uuid);
// INCOMPLETE: 타워 초기화, 몬스터 초기화 추가해야 함
console.log(`[INIT] game execution completed - ${uuid}`);
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
return { status: 'success', message: `Game started` };
};
export const gameEnd = (uuid) => {
try {
// 최고 점수 여부 판단 후 기록
const saveResult = saveHighScore(uuid);
if (saveResult.status === fail) throw new Error(saveResult.message);
// 해당 uuid 삭제 진행
deleteAccount(uuid);
deleteStage(uuid);
deleteScore(uuid);
//INCOMPLETE: 몬스터, 타워 삭제 추가해야 함.
} catch (err) {
console.error(err.message);
return { status: 'fail', message: err.message };
}
return { status: 'success', message: 'Game ended' };
};
원래 맡았던 부분이 아니긴 한데, 맡은 사람이 없어서 그냥 만들었다.
내일 몬스터, 타워 담당하신 팀원분들 코드 완성되면 추가해서 마무리 지으면 될 것 같다.
팀프로젝트 끝나면 작성한 파일들 모듈화 해서 에러처리도 따로 분리해야겠다.
현재 구현이 안 되어있어 중복 코드가 너무 많은 것 같다.