[TIL] 24.10.14 MON

GDORI·2024년 10월 14일
0

TIL

목록 보기
71/79
post-thumbnail

오늘 푼 알고리즘 코드카타

131704. 택배상자

문제풀이

와 처음에 보고 이해가 안가서 고민을 좀 많이 했는데, 저 order로 주어진걸 1,2,3,4,5 순으로 넣다 뺐다 해서 구하라는건 줄 알았으나, 그게 아닌 1,2,3,4,5 순으로 상자가 컨베이어 벨트에 올려져있고, ORDER [4,3,1,2,5] 이면 4번 상자가 첫번째로
트럭에 실려야 한다는 내용이다. 스택을 이용하여 문제를 풀면 된다.

JS코드

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 명령어

명령어

git checkout -p 가져올 브랜치 이름 -- 가져올 특정파일 경로

작업중인 브랜치(A)에서 B 브랜치의 특정 파일을 가지고 오고 싶을 때 위 명령어를 입력하면 된다.
그러면 사진처럼 뿅~ 하고 변경 내역을 물어보고 y를 입력해주면 가져올 수 있다.

오늘 작업한 팀프로젝트 코드 일부

score.handler

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 };
  }
};

stage.handler

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 };
  }
};

game.handler

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' };
};

game.js 는 너무 길어서 패스

원래 맡았던 부분이 아니긴 한데, 맡은 사람이 없어서 그냥 만들었다.
내일 몬스터, 타워 담당하신 팀원분들 코드 완성되면 추가해서 마무리 지으면 될 것 같다.
팀프로젝트 끝나면 작성한 파일들 모듈화 해서 에러처리도 따로 분리해야겠다.
현재 구현이 안 되어있어 중복 코드가 너무 많은 것 같다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글