본문 바로가기

Algorithm/99클럽

[99클럽] 코딩테스트 스터디, 13일차 TIL - 비기너 (백준, 25497)

728x90

 

1. 문제풀이

1) 문제, 기술 연계마스터 임스 (백준, 25497)

임스는 연계 기술을 사용하는 게임을 플레이 중에 있다.

연계 기술은 사전 기술과 본 기술의 두 개의 개별 기술을 순서대로 사용해야만 정상적으로 사용 가능한 기술을 말한다.

하나의 사전 기술은 하나의 본 기술과만 연계해서 사용할 수 있으며,

연계할 사전 기술 없이 본 기술을 사용했을 경우에는 게임의 스크립트가 꼬여서 이후 사용하는 기술들이 정상적으로 발동되지 않는다.

그렇지만 반드시 사전 기술을 사용한 직후에 본 기술을 사용할 필요는 없으며,

중간에 다른 기술을 사용하여도 연계는 정상적으로 이루어진다.

 

임스가 사용할 수 있는 기술에는 1~, L, R, , K가 있다. 

1~9는 연계 없이 사용할 수 있는 기술이고, L은 R의 사전 기술, S은 K의 사전 기술이다.

 

임스가 정해진 순서대로 N개의 기술을 사용할 때, 기술이 몇 번이나 정상적으로 발동하는지를 구해보자.

단, 연계 기술은 사전 기술과 본 기술 모두 정상적으로 발동되었을 때만 하나의 기술이 발동된 것으로 친다.

 

입력

첫 번째 줄에는 총 기술 사용 횟수 N이 주어진다. (1≤N≤200000)

두 번째 줄에는 임스가 사용할 N개의 기술이 공백 없이 주어진다.

 

출력

임스가 정상적으로 기술을 사용한 총 횟수를 출력한다.

 

 

2) 해석

 

- N개의 기술을 사용할 때, 정상적으로 사용한 기술의 총 횟수 출력

- 1 ~ 9 = 연계 없이 사용 할 수 있는 기술

- L은 R의 사전 기술

- S는 K의 사전 기술

 

- 하나의 사전 기술은 하나의 본 기술과만 연계에서 사용.

- 사전 기술 없이 본 기술 사용시, 이후 기술들도 사용x

- 반드시 직후에 사용해야 하는 건 아님. 중간에 다른 기술 사용o 

 

숫자면 count++

숫자가 아니라면 이 전 값 체크 > R이라면 L이 있었는지, S라면 K가 있었는지

있었으면 count++ 아니면 return

 

 

3) 풀이

const fs = require("fs");
const input = fs.readFileSync("./index.txt").toString().trim().split("\n");

const N = Number(input[0]);
const skills = input[1];

let count = 0;
let R_prevSkillCount = 0;
let S_prevSkillCount = 0;

for (let i = 0; i < N; i++) {
  const skill = skills[i];

  if (!isNaN(skill)) count++;
  else if (skill === "L") R_prevSkillCount++;
  else if (skill === "S") S_prevSkillCount++;
  else if (skill === "R" && R_prevSkillCount > 0) {
    count++;
    R_prevSkillCount--;
  } else if (skill === "K" && S_prevSkillCount > 0) {
    count++;
    S_prevSkillCount--;
  } else return console.log(count);
}

console.log(count);

 

for문과 if문을 사용해서 각 조건대로 처리하도록 구현했다. 

 

 

let count = 0;
let R_prevSkillCount = 0;
let S_prevSkillCount = 0;

 

우선 기술 횟수를 담을 count 변수를 만들어주고, 사전 스킬의 횟수를 담을 변수들을 만들어준다.

 

처음엔 prevSkill을 하나의 변수로 묶어서 사용했었다. 

그러나 연계 스킬의 경우, 사전 스킬 직후에 바로 사용해야 하는 것은 아니기 때문에 나눠줬다.

 

 

for (let i = 0; i < N; i++) {
  const skill = skills[i];

  if (!isNaN(skill)) count++;
  else if (skill === "L") R_prevSkillCount++;
  else if (skill === "S") S_prevSkillCount++;
  else if (skill === "R" && R_prevSkillCount > 0) {
    count++;
    R_prevSkillCount--;
  } else if (skill === "K" && S_prevSkillCount > 0) {
    count++;
    S_prevSkillCount--;
  } else brack;
}

 

이후 for문을 통해 각 스킬에 맞게 조건문을 구현했다.

 

우선 숫자 스킬의 경우 무조건 정상적으로 사용되므로 isNaN 조건문을 통해 count++ 하도록 구현했다.

그리고 L, S의 경우 사전 스킬이므로 각 변수에 +1 하도록 만들었다.

 

R와 K의 경우 반드시 사전 스킬이 사용되었어야만 실행이 가능하다.

따라서 사전 스킬 count가 0보다 큰 경우에만 count++을 하도록 만들었다.

그 후에는 사전 스킬을 한 번 사용했으므로 사전 스킬의 값에 -1을 해줬다.

 

 

 

- 걸린시간

 

잘못눌러서 +30분 하면 될듯 총 38분!

 

2. 기타

1) for - break

 

처음엔 forEach를 사용했는데, 해당 문제는 break가 필요하기 때문에 for문으로 변경했다.

 

 

2) break vs continue vs return

728x90
반응형