🏀 문제

 

불합격 😥

풀다가 막혀서 다른사람의 코드를 보고 작성 해보았다.

 

 

 

합격코드

function solution(priorities, location) {
  let answer = 0;
  let count = 0;
  let target_location = location;

  while (priorities.length > 0) {
    let first = priorities.shift();
    if (priorities.filter((e) => e > first).length > 0) {
      priorities.push(first);
    } else {
      count += 1;
      if (target_location === 0) {
        return (answer = count);
      }
    }
    target_location -= 1;
    if (target_location === -1) {
      target_location = priorities.length - 1;
    }
  }

  return answer;
}

// console.log(solution([2, 1, 3, 2], 2));
console.log(solution([1, 1, 9, 1, 1, 1], 0));

먼저 몇번째로 출력되었는지를 알려주는 count , 내가 출력하려는 타겟이 배열의 몇번째 위치에 있는지 알려주는 변수를 선언했다.

while문으로 배열의 길이가 0보다 클때가지 로직을 돌려 주었지만 내 타겟이 출력되면 return으로 while문을 강제 종료시켰다.

 

first라는 변수에 배열의 첫번째 값을 빼서 저장시켜주고 그 값을 기준으로 배열의 filter함수를 돌려 기준값보다 큰 값이 배열에 존재하는지 여부를 판단했다.

만약 배열의 길이가 0보다 크다면 현재 기준 값보다 큰 숫자가 배열에 존재한다는 뜻임으로 우선순위에서 밀려나며 그 값은 다시 배열의 마지막으로 들어간다.

이제 first 보다 큰 값이 없다는 뜻은 현재 기준값을 출력해줘야 한다는 뜻이고 출력과 동시에 count숫자를 올려주고 출력값은 사라진다.

현재 타겟의 위치가 0이라는 것은 내가 출력하려는 값이 가장 앞에 와있고 우선순위에 가장 높다는 뜻임으로 return으로 while문을 종료시켜준다. 

 

if else의 조건문과 별개로 while문이 돌아갈때마다 타겟의 위치는 변해야하며 내가 출력하려는 타겟의 위치가 첫번째를 지나 -1이되면 다시 타겟의 위치를 배열의 가장 마지막으로 보내준다.

 

 

문제를 풀고난후

한글로 코드를 설명하며 정리하려다 보니깐 더 어려운점이 있는것 같다. 

가장 헷갈렸던 부분이 로직을 몇번 돌려야 할지 고민하는 것이 였는데 위에 코드처럼 while문으로 로직을 가장 마지막 발생할수잇는 경우의 수까지 돌린 다음 조건이 맞으면 return문으로 강제 종료시키는 방법도 좋은것 같다.

 

 

📌 문제풀러가기 https://programmers.co.kr/learn/courses/30/lessons/42587

 

코딩테스트 연습 - 프린터

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린

programmers.co.kr

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

실패물  (0) 2021.07.23
숫자문자열과 영단어  (0) 2021.07.22
자연수를 뒤집어 배열로 만들기  (0) 2021.07.20

🏀  문제

 

합격 😀 (내가 풀이한 코드)

function solution(N, stages) {
  let answer = [];
  let count = 0;
  let total = stages.length;
  let box = [];
  // 스테이지
  for (let i = 1; i <= N; i++) {
    // 현재 스테이지에 멈춰 있는 사람을 구하기 위해 stages배열 순회
    for (let x = 0; x < stages.length; x++) {
      if (i === stages[x]) {
        count += 1;
      }
    }
    box.push({ stage: i, lost: count / total });
    total = total - count;
    count = 0;
  }
  box = box.sort((a, b) => {
    if (b.lost === a.lost) {
      return a.stage - b.stage;
    } else {
      return b.lost - a.lost;
    }
  });
  for (let i = 0; i < box.length; i++) {
    answer.push(box[i].stage);
  }
  return answer;
}
console.log(solution(5, [2, 1, 2, 6, 2, 4, 3, 3]));

 

먼저 스테이지의 갯수 N만큼 스테이지 도전자들의 배열을 확인해 주기위해 for문으로 최상단을 감싸주었다.

그 다음 현재 스테이지 N을 클리어 하지못하고 멈춰잇는 사람들이 몇명이나 있나를 구해주기위해 stages의 배열을 순회 해주었고 클리어 하지 못한 사람이 있으면 count의 갯수를 늘려주었다.

그 다음 임시 저장소인 box 배열에 객체형태로 현재의 스테이지와 실패율을 계산하여 push해주었다.

그렇게 for문이 모두 돌아가고 나면 box변수에는 모든 스테이지마다 클리어하지 못한 사람들이 정렬 되지 않은 형태로 들어가게 된다.

이제 조건에 맞추어 먼저 실패율의 key값인 lost를 sort정렬로 오름차순 정렬을 해준다 여기서 실패율의 크기가 같을 시에는 스테이지가 더 낮은 쪽이 앞에 와야한다는 조건을 맞춰 주기위해 stage내림차순으로 정렬해준다.

이제 조건에 만족하는 box의 형태가 나오고 객체의 형태인 box값에서 현재 필요한 stage순서만을 추출해주기위해 for문으로 값을 추출해 answers넣어준다!!!

 

  

 

문제를 풀고 난 후..

  • 이게 LEVEL1문제라늬... 도대체 LEVEL3정도 까지 풀라면 얼마나 더 열심히 해야할지 가늠이 안된다..
  • 문제를 풀면서 느낀점인데 문제를 읽고 모든걸 다 이해해서 코드를 짜는 방식보단 어느정도 이해를 바탕으로 코드를 짜면서 틀린 부분을 수정하고 콘솔로그를 찍어보면서 조금씩 수정해 나가는 방식이 나랑 더 잘맞는것 같다.. (한번에 다 이해 못하고 푸는것도 있다...)

 

 

 

📌 문제  풀러가기 => https://programmers.co.kr/learn/courses/30/lessons/42889?language=javascript

 

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

 

 

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

프린터.js  (0) 2021.08.11
숫자문자열과 영단어  (0) 2021.07.22
자연수를 뒤집어 배열로 만들기  (0) 2021.07.20

 

🏀  문제

 

 

불합격 😥 (내가 풀이한 코드)

function solution(s) {
  let answer = "";
  let box = s.split("");
  const number = [
    { name: 0, value: "zero" },
    { name: 1, value: "one" },
    { name: 2, value: "two" },
    { name: 3, value: "three" },
    { name: 4, value: "four" },
    { name: 5, value: "five" },
    { name: 6, value: "six" },
    { name: 7, value: "seven" },
    { name: 8, value: "eight" },
    { name: 9, value: "nine" },
  ];
  const length = box.length;
  let val = "";
  for (let i = 0; i < length; i++) {
    if (parseInt(box[i])) {
      answer += box[i];
    } else {
      val += box[i];
      for (let x = 0; x < number.length; x++) {
        if (number[x].value == val) {
          answer += number[x].name;
          val = "";
        }
      }
    }
  }
  answer = parseInt(answer);

  return answer;
}

내가 쓴 코드를 보면 맨처음 문자열을 받아 split함수를 사용하여 각 원소마다 잘라주었고 잘라진 원소 배열의 모든 길이를 for문으로 돌렸다

for문 안을 보면 받아온 문자를 parseInt형으로 바꾸어주엇을때 NaN이 아닌 숫자가 나온다면 현재 받아온  문자열의 원래값(?)이 숫자라는 것을 알수있고 그렇다면 숫자를 그대로 answer에 추가하엿다 .

이제 원소가 숫자가 아닌 경우 하나의 원소를 받을때마다 객체 number에 들어잇는 value값을 비교하여 값아 지면 answer의 해당하는 숫자를 넣어주고  임시보관소인 val를 초기화 해준다 마지막으로 문자열인 answer값을 정수형으로 변환 해준다 

 

---> 이 코드를 제출하였을때 테스트케이스 10번을 제외하고 모든 조건을 만족하였다  나는 아직 어떤 경우에서 잘못된건지 잘 모르겠다 😓

 

 

정답 코드 ⚽️

function solution(s) {
    var answer = 0;
    s = s.replace(/one/g,'1');
    s = s.replace(/two/g,'2');
    s = s.replace(/three/g,'3');
    s = s.replace(/four/g,'4');
    s = s.replace(/five/g,'5');
    s = s.replace(/six/g,'6');
    s = s.replace(/seven/g,'7');
    s = s.replace(/eight/g,'8');
    s = s.replace(/nine/g,'9');
    s = s.replace(/zero/g,'0');
    console.log(s);
    s = Number(s);
    return s;
}
  • 다른 분들은 자바스크립트 내장함수인 replace를 사용하여 해결한 것을 볼수 있다.
  • replace함수는 원래 바꿀 문자열 중 가장 앞에 있는 것 하나만! 바꿔준다
  • '/' 로 바꿀 문자열을 감싸준 뒤 문자열의 뒤에 'g'를 붙이면 한번에 해당하는 모든 문자열을 치환할 수 있다!

 

 

문제를 풀고 난 후..

  • 정규식과 기존의 알고잇엇던 내장함수를 이용할 방법을 잘 생각해야겠다... 
  • 직접 구현하려다 보니 시간도 꽤 뺏기고 어려웠던것 같다... 다음부터는 내장함수를 잘 이용해서 문제를 풀어야겠따

 

📌 문제  풀러가기 => https://programmers.co.kr/learn/courses/30/lessons/81301

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

 

 

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

프린터.js  (0) 2021.08.11
실패물  (0) 2021.07.23
자연수를 뒤집어 배열로 만들기  (0) 2021.07.20

먼저 문제를 보자

정수형 숫자를 함수에 넣어주면 값을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴 하라는 문제이다.

 

 

 

 

 

내가 해결 한 방식은 다음과 같다.

1.  먼저 정수형인 n값을 문자열로 바꾼 다음 split("")함수로 띄워쓰기 없이 box 라는 변수에 값을 저장 한다

-->  box === [ '1', '2', '3', '4', '5' ] 

2. box의 길이를 length라는 변수에 저장한다. ( pop()함수를 이용하기 때문에 for문안에서 box.length의 길이가 변할수 있기때문 )

3. 변하지 않는 고정값인 length를 이용하여 box의 가장 오른쪽에 있는 원소부터 answer에 push

---> answer === ['5', '4', '3', '2', '1']

4. 다시 정수형으로 변환 해주기위해 answer의 원소를 모두 map함수를 이용하여 새로운 배열로 만들어주는데 이때 paresInt를통하여 정수 형으로 변환 

 

 

 

 

 

다른 사람들의 코드를 확인해보자

정수형인 n값에 n+""하면 정수형이 문자열로 타입이 바뀌게 된다. (이건 처음알았다...)

문자열로 변경된 값을 split("")을 이용하여 띄워쓰기없이 모든 원소를 분해시키고 reverse()라는 함수로 값을 뒤집어 주었다(reverse함수 알고 있었지만 자주 사용하는 함수가 아니다 보니 존재자체를 까먹고 있었따..) map은 동일하게 정수형으로 모든 원소를 변경 시켜주었따

 

 

 

 

내가 푼 코드에 비해 다른 사람들의 코드는 훨씬 짧아 내장함수의 종류를 까먹지 않고 필요할때 사용하는 것이 중요하다고 느껴졌다

정수형에 + "" 하면 문자열로 변한다는 사실과 reverse함수를 까먹지 말아야겟다!

'알고리즘 > 프로그래머스' 카테고리의 다른 글

프린터.js  (0) 2021.08.11
실패물  (0) 2021.07.23
숫자문자열과 영단어  (0) 2021.07.22

+ Recent posts