[알고리즘] 백준 1813 논리학 교수 (자바스크립트)

Subin·2022년 12월 15일
0
post-thumbnail
post-custom-banner

리스트
논리학 교수

✏️ 요구 사항 분석

입력

  • 첫째 줄에는 항승이가 한 말한 개수 N
  • 둘째 줄에는 칠판에 작성한 내용에 있는 정수

출력

항승이가 칠판에 작성한 내용중 총 몇개의 내용이 참인지 출력

  • 칠판에 있는 정수가 정수의 개수만큼 있으면 그 정수가 답이다.
  • 모순이라면 -1
  • 가능한 답이 여러 가지라면 그중 가장 큰 값

🗒 내 풀이

function solution(blackBoard) {
  const input = blackBoard.split("\n");
  const N = parseInt(input[0]);

  if (!(50 >= N >= 1)) {
    return -1;
  }

  const contents = input[1]
    .split(" ")
    .map(Number)
    .sort((a, b) => b - a);

  for (let i = 0; i < N; i++) {
    let content = contents[i];

    if (!(0 <= content <= 50)) {
      return -1;
    }

    let count = 0;

    for (let j = 0; j < N; j++) {
      if (content === contents[j]) {
        count++;
      }
    }

    if (content === count) {
      return content;
    }
  }

  if (!contents.includes(0)) {
    return 0;
  }
  
  return -1;
}

const blackBoard = `2
1 1`;

console.log(solution(blackBoard));

⌨️ 풀이 과정

1

const contents = input[1]
    .split(" ")
    .map(Number)
    .sort((a, b) => b - a);

답이 여러 가지라면 가장 큰 값을 출력하는 조건이 있기에 입력값을 내림차순으로 정렬하였다.

2

for (let i = 0; i < N; i++) {
    let content = contents[i];
    let count = 0;
    
    for (let j = 0; j < N; j++) {
      if (content === contents[j]) {
        count++;
      }
    }
    
    if (content === count) {
      return content;
    }
}

content에 칠판에 작성한 수 1개를 넣고 그 content와 같은 수가 있는지 체크한다.
content와 content와 같은 수의 개수를 비교해 같으면 정답으로 리턴한다.

3

if (!contents.includes(0)) {
  return 0;
}
return -1;

만약 0개가 0개라면 정답은 0임으로 0을 리턴한다.
위의 모든 조건이 충족되지 않으면 모순되므로 -1을 리턴한다.

4 예외 처리

if (!(50 >= N >= 1)) {
  return -1;
}

if (!(0 <= content <= 50)) {
  return -1;
}

N은 1보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄은 50보다 작거나 같은 음이 아닌 정수이다.!

profile
고양이가 세상을 지배한다.
post-custom-banner

0개의 댓글