고슴맨쉬
망치와 공(空)
고슴맨쉬
  • 분류 전체보기 (155)
    • 💡 UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • 개념 (42)
      • 정리 (2)
      • 문제풀기 (프로그래머스, 코딩애플) (15)
      • 응용하여 자동화or문제해결하기 (2)
      • 기타 (5)
    • ⚛️ React (49)
      • 개념 (27)
      • 개념(Redux) (3)
      • 정리 (4)
      • 문제풀기 (코딩애플: React) (15)
    • 📘 TypeScript (10)
      • 개념 (8)
      • 문제풀기 (코딩애플) (2)
    • 🌐 HTML,CSS (18)
      • 실무에서 자주 발생한 오류들 (10)
      • 뒤늦게 알아서 뼈아픈 유용한 CSS (6)
      • 기타 자주 쓰는 CSS (2)
    • 💻 CS (8)
      • CS (5)
      • 정규표현식 (2)
      • Git,Github (1)

태그

  • TypeScript
  • array
  • redux
  • react
  • CSS
  • state
  • object
  • 오류
  • 삼항연산자
  • class
  • json
  • UXUI
  • axios
  • 코딩애플
  • 프로그래머스
  • Ajax
  • useEffect
  • JavaScript
  • Props
  • CS
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
고슴맨쉬

망치와 공(空)

🟨 JavaScript/문제풀기 (프로그래머스, 코딩애플)

[프로그래머스 Level 1] PCCP 기출문제 1번 : 붕대 감기

2023. 12. 19. 16:01

어떤 게임에는 붕대 감기라는 기술이 있습니다.

붕대 감기는 t초 동안 붕대를 감으면서 1초마다 x만큼의 체력을 회복합니다. t초 연속으로 붕대를 감는 데 성공한다면 y만큼의 체력을 추가로 회복합니다. 게임 캐릭터에는 최대 체력이 존재해 현재 체력이 최대 체력보다 커지는 것은 불가능합니다.

기술을 쓰는 도중 몬스터에게 공격을 당하면 기술이 취소되고, 공격을 당하는 순간에는 체력을 회복할 수 없습니다. 몬스터에게 공격당해 기술이 취소당하거나 기술이 끝나면 그 즉시 붕대 감기를 다시 사용하며, 연속 성공 시간이 0으로 초기화됩니다.

몬스터의 공격을 받으면 정해진 피해량만큼 현재 체력이 줄어듭니다. 이때, 현재 체력이 0 이하가 되면 캐릭터가 죽으며 더 이상 체력을 회복할 수 없습니다.

당신은 붕대감기 기술의 정보, 캐릭터가 가진 최대 체력과 몬스터의 공격 패턴이 주어질 때 캐릭터가 끝까지 생존할 수 있는지 궁금합니다.

붕대 감기 기술의 시전 시간, 1초당 회복량, 추가 회복량을 담은 1차원 정수 배열 bandage와 최대 체력을 의미하는 정수 health, 몬스터의 공격 시간과 피해량을 담은 2차원 정수 배열 attacks가 매개변수로 주어집니다. 모든 공격이 끝난 직후 남은 체력을 return 하도록 solution 함수를 완성해 주세요. 만약 몬스터의 공격을 받고 캐릭터의 체력이 0 이하가 되어 죽는다면 -1을 return 해주세요.


제한사항

  • bandage는 [시전 시간, 초당 회복량, 추가 회복량] 형태의 길이가 3인 정수 배열입니다.
    • 1 ≤ 시전 시간 = t ≤ 50
    • 1 ≤ 초당 회복량 = x ≤ 100
    • 1 ≤ 추가 회복량 = y ≤ 100
  • 1 ≤ health ≤ 1,000
  • 1 ≤ attacks의 길이 ≤ 100
    • attacks[i]는 [공격 시간, 피해량] 형태의 길이가 2인 정수 배열입니다.
    • attacks는 공격 시간을 기준으로 오름차순 정렬된 상태입니다.
    • attacks의 공격 시간은 모두 다릅니다.
    • 1 ≤ 공격 시간 ≤ 1,000
    • 1 ≤ 피해량 ≤ 100

나의 풀이

function solution(bandage, health, attacks) {
  // t초 : 붕대감는 시간
  // x : 1초마다 회복하는 체력량
  // y : t초 연속 붕대감기 성공 시 추가 회복하는 체력량
  // bandage : [기술시전시간, 1초당 회복량(x), 추가회복량(y)]
  // health : 최대체력
  // attacks : [몬스터공격시간, 피해량]

  // ** 체력은 최대 체력을 넘길 수 없다.
  // ** 체력이 0 이하가 되면 캐릭터 사망, 더이상 체력회복 불가능
  // ** 공격을 받으면 피해량만큼 체력이 줄어든다.

  // ** 기술을 쓰는 도중 공격을 당하면 취소된다. 공격을 당하는 중에는 기술을 쓸 수 없다.
  // ** 기술을 쓰는 도중 공격을 당해 취소/기술이 끝나면 즉시 다시 기술을 쓴다. (연속 성공 시간 0으로 초기화)
  
  // return 모든 공격이 끝난 직후 남은 체력 (사망시 -1)

  let lastTime = attacks[attacks.length -1][0]; // 마지막공격까지의 총 시간
  let attackTime = attacks.map((att) => att[0]); // 공격하는 시간 array
  let nowHealth = health; // 현재체력
  let bandageTime =  0; // 기술시전횟수

  for(let time = 0; time <= lastTime; time++){
    console.log("\n", time, "초");

    let attackedInfo = attacks.find((attack) => attack[0] === time); // 이번 시간(초)의 공격정보
    const doBandage = function() { // 회복기술 함수
      if(attackTime.some((attTime) => attTime === time)){
        bandageTime = 0;
      } else {
        bandageTime++;

        nowHealth = nowHealth + bandage[1];
        if(nowHealth > health){
          nowHealth = health;
        }
        console.log(`기술시전 ${bandageTime}회째, ${bandage[1]} 만큼 회복했다! 현재 체력은 ${nowHealth}.`);

        if(bandageTime === bandage[0]){
          nowHealth = nowHealth + bandage[2];
          bandageTime = 0;
          if(nowHealth > health){
            nowHealth = health;
          }
          console.log(`연속 붕대감기 성공, ${bandage[2]} 만큼 추가 회복했다! 현재 체력은 ${nowHealth}.`);
        }
      }
    }
    doBandage();
    // 공격
    if(attackedInfo !== undefined){
      if(time === attackedInfo[0]){
        nowHealth = nowHealth - attackedInfo[1];
        console.log(`${attackedInfo[1]} 만큼 공격받았다! 현재 체력은 ${nowHealth}.`);
        if(nowHealth <= 0){
          console.log(`플레이어가 사망했습니다.`);
          return -1;
        }
      }
    }
  }

  if(nowHealth <= 0){ return -1 }
  return nowHealth;
}

나중에 볼 때를 대비해 콘솔과 주석을 포함한 풀이로 저장해둔다.


출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges

저작자표시 비영리 동일조건 (새창열림)

'🟨 JavaScript > 문제풀기 (프로그래머스, 코딩애플)' 카테고리의 다른 글

[프로그래머스 Level 1] 2022 KAKAO BLIND RECRUITMENT : 신고 결과 받기  (1) 2023.12.11
[프로그래머스 Level 1] 달리기 경주  (0) 2023.12.10
[프로그래머스 Level 1] 바탕화면 정리  (0) 2023.12.10
[프로그래머스 Level 1] 추억 점수  (0) 2023.12.10
[프로그래머스 Level 1] 삼총사  (0) 2023.12.10
    '🟨 JavaScript/문제풀기 (프로그래머스, 코딩애플)' 카테고리의 다른 글
    • [프로그래머스 Level 1] 2022 KAKAO BLIND RECRUITMENT : 신고 결과 받기
    • [프로그래머스 Level 1] 달리기 경주
    • [프로그래머스 Level 1] 바탕화면 정리
    • [프로그래머스 Level 1] 추억 점수
    고슴맨쉬
    고슴맨쉬
    부수되 집착하지 않고, 이해하되 머무르지 않기

    티스토리툴바