본문 바로가기
코딩 테스트 문제 및 풀이

[JS] 코딩 테스트 문제 : 교육과정 설계 [큐]

by spare8433 2024. 1. 8.

문제 : 교육과정 설계



문제 설명


현수는 1년 과정의 수업계획을 짜야 합니다.
수업중에는 필수과목이 있습니다. 이 필수과목은 반드시 이수해야 하며, 그 순서도 정해져 있습니다.


만약 총 과목이 A, B, C, D, E, F, G가 있고, 여기서 필수과목이 CBA로 주어지면 필수과목은
C, B, A과목이며 이 순서대로 꼭 수업계획을 짜야 합니다.
여기서 순서란 B과목은 C과목을 이수한 후에 들어야 하고, A과목은 C와 B를 이수한 후에 들어야 한다는 것입니다.
현수가 C, B, D, A, G, E로 수업계획을 짜면 제대로 된 설계이지만 C, G, E, A, D, B 순서로 짰다면 잘 못 설계된 수업계획이 됩니다.


수업계획은 그 순서대로 앞에 수업이 이수되면 다음 수업을 시작하다는 것으로 해석합니다.
수업계획서상의 각 과목은 무조건 이수된다고 가정합니다.
필수과목순서가 주어지면 현수가 짠 N개의 수업설계가 잘된 것이면 “YES", 잘못된 것이면 ”NO“를 출력하는 프로그램을 작성하세요.

▣ 입력설명

첫 줄에 한 줄에 필수과목의 순서가 주어집니다. 모든 과목은 영문 대문자입니다.
두 번 째 줄부터 현수가 짠 수업설계가 주어집니다.(수업설계의 길이는 30이하이다)


▣ 출력설명

수업설계가 잘된 것이면 “YES", 잘못된 것이면 ”NO“를 출력합니다.


▣ 입력예제 1

CBA
CBDAGE


▣ 출력예제 1

YES



내코드


function solution(need, plan) {
  let answer = "YES";
  let answerArr = [];
  let checkIndex = 0;

  // 필수과목 0번째 부터 수업계획 과목과 비교해서 동일한 경우 정답 배열에 저장하고 필수과목의 순서를 의미하는 인덱스 1 증가
  // 최종적으로 정답 배열에 담긴 내용과 필수과목순서와 동일한지 확인
  for (const subject of plan) {
    if (subject === need[checkIndex]) {
      answerArr.push(subject);
      checkIndex++;
    }
  }

  if (answerArr.join("") !== need) answer = "NO";

  return answer;
}

var a = "CBA";
var b = "CBDAGE";
console.log(a, b, solution(a, b)); // YES
a = "CBA";
b = "CDAGBE";
console.log(a, b, solution(a, b)); // NO



풀이


  1. 수업계획 과목배열을 순회하면서 필수과목 첫번째 부터 수업계획 과목과 비교해서 동일한 경우 정답 배열에 저장하고 필수과목의 순서를 의미하는 checkIndex 를 1 증가
  2. 최종적으로 정답 배열에 담긴 내용과 필수과목 순서와 동일한지 확인 후 YES or NO 를 반환



다른 해결 방법


// que 로 처리하는 방식
function solution(need, plan) {
  let answer = "YES";
  let queue = need.split("");

  // 수업계획의 과목수 만큼 순회
  for (let x of plan) {
    // queue 에 과목 x 가 있다면 queue 배열의 0번째 과목과 수업계획 과목 x 와 같지않은 경우 필수과목의 순서가 잘못됨을 의미
    if (queue.includes(x)) {
      if (x !== queue.shift()) return "NO";
    }
  }

  // 수업 계획에 필수과목이 없는 경우
  if (queue.length > 0) return "NO";
  return answer;
}



풀이


  1. 수업계획의 과목수 만큼 순회하면서 필수과목 문자열을 배열 queue 로 변경 후 includes 메서드를 통해 현재 수업계획의 과목 x 가 존재하는지 확인 후 존재하는 경우 queue 배열의 첫번째 과목을 shift 하여 꺼낸 값과 x와 동일하지 않는 경우에는 필수과목의 순서가 잘못됨을 의미 하므로 "NO" 를 반환
  2. 위 검증 과정이 모두 마친 후 queue 배열의 길이가 0 보다 큰 즉 모든 필수과목 순서가 반영되지 않은 것을 의미하므로 "NO " 를 반환




참고

https://www.inflearn.com/course/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%AC%B8%EC%A0%9C%ED%92%80%EC%9D%B4/dashboard