코드노트

알고리즘 문제 오답풀이_1 본문

Code note/자바스크립트 알고리즘 문제풀이

알고리즘 문제 오답풀이_1

코드노트 2022. 9. 29. 22:44

keys

더보기

문제 설명

열쇠와 문은 알파벳으로 이루어져있다.

예를 들어 열쇠의 획득 순서는 "bgr", 앞에 놓인 문들은 "RGB"라고 했을 때

r열쇠와 R문이 매칭된다.

g열쇠와 G문이 매칭되고 마지막으로 b문과 B문을 매칭하여 탈출할 수 있다.

이 때, 던전을 탈출할 수 있다면 YES, 탈출할 수 없다면 NO를 출력한다.

 

테스트 케이스

keys = "rgb"

doors = "RGB"

출력값 NO

 

- 이 문제는 스택문제였다. 그냥 순서대로 대문자 또는 소문자로 바꾸기만 하면 될 줄 알았다.

- 예를 보게 되면 keys의 첫 문자와 doors의 끝문자가 맞으면 통과되는걸 볼 수 있다.

 

function solution(keys, doors) {
    keys = keys.split('');
    doors = doors.split('');

    while (keys.length) {
        if (keys.pop().toUpperCase() !== doors.shift()) {
            return 'NO'
        }
    }
    
    return 'YES'
}

- split으로 배열을 만들고 while을 순회한다.

- key의 끝문자를 pop을 시키고 대문자로 변경한다. 그리고 doors의 shift를 통해서 앞문자를 서로 비교한다.

 

function solution(keys, doors) {
  keys = keys.split("");
  doors = doors.split("").reverse();

  for (let i = 0; i < keys.length; i++) {
    if (keys[i].toUpperCase() !== doors[i]) {
      return "NO";
    }
  }

  return "YES";
}

- while을 사용안하고도 doors를 reverse시킨 후 비교해도 된다.

 


police

더보기

문제 설명

경찰을 1명 뿐이고, 도둑은 k명이 있다.

도둑은 공항에 도착하면 비행기를 타고 도망칠 수 있다.

공항의 위치는 N에 있고 경찰은 현재 0의 위치에 있다.

모든 도둑들은 하나의 직선 상에 존재하고 경찰의 우측과 공항의 좌측편에 위치할 수 있다.

또한 하나의 위치에 여러 도둑이 존재할 수 있다.

 

1시간이 지날때마다, 도둑과 경찰은 움직이는데 먼저 도둑 한 명이 1시간마다 오른쪽으로 한 칸씩 움직일 수 있다.

만약 도둑이 오른쪽으로 움직였을 때, 그 위치가 공항인 경우에는 도둑은 도망갈 수 있다.

한명의 도둑이 움직이고 나서, 경찰이 움직일 수 있는데 경찰 역시 1시간마다 오른쪽으로 한 칸 씩 움직인다.

 

이때 경찰의 위치에 있는 도둑은 몇명이든 체포된다. 이 시간들은 경찰이 공항에 도착하면 끝이 나게 되고,

경찰이 공항에 도착할 때까지 최대한으로 도망칠 수 있는 도둑은 몇 명인지 반환하면 된다.

 

테스트케이스

n = 10

k = 6

theives = [8, 7, 5, 4, 9, 4]

- 문제를 처음 보고 이해가 하나도 안되는 문제... 바로 노트 꺼내서 그림을 그려따.......

- 문제는 간단하게 말하면 0의 위치에서 n의 위치인 공항까지 경찰은 움직인다. 그 사이의 숫자들에 도둑이 있다.

 

function solution(n, k, theives) {
  let police = 0;
  let answer = 0;
  theives.sort(function (a, b) {
    return b - a;
  });
  for (let i = 0; i < k; i++) {
    if (police >= theives[i]) break;
    police += n - theives[i];
    answer++;
  }

  return answer;
}

- 도둑의 위치를 내림차순으로 정렬한다.

- k도둑의 수만큼 for문을 돌면서 만약 police변수가 도둑의 위치 i 보다 크거나 같으면 break한다.

- police에는 n - theives[i]를 해주며 값을 더해주고 answer++을 해준다.