스터디 기록 25

유아현·2023년 1월 16일
0

Study

목록 보기
26/27
post-thumbnail

문제 목록

❤️‍🔥 프린터

function solution(priorities, location) {
  /*
  [{우선순위: 중요도, 처음 인덱스: 인덱스}, {우선순위: 중요도, 처음 인덱스: 인덱스}, {...}, ...]
  map을 통해서 해당 배열을 만들어 줌
 */

  const priorityIdx = priorities.map((e, idx) => {
    return {
      priority: e,
      idx: idx,
    };
  });

  console.log(priorityIdx);

  /*
 맨앞의 요소를 꺼내어 기준으로 삼아
 some 메서드를 사용하여 기준의 우선순위보다 순회하는 요소들 중 
 우선순위가 더 높은 게 있으면 => true => 지금 기준이 되는 문서(criteria)를 맨뒤로 보내고
 우선순위가 더 높은 게 없다면 => false => 바로 출력이므로 queue에 담아 줌
 */

  const queue = [];
  while (priorityIdx.length > 0) {
    const criteria = priorityIdx.shift();
    const boolean = priorityIdx.some((e) => e.priority > criteria.priority);
    // 더 큰 게 있으면 뒤로 보내 줘야 됨
    // 그렇지 않으면  출력
    boolean ? priorityIdx.push(criteria) : queue.push(criteria);
  }

  /* queue에는 중요순대로 출력된 문서들이 담겨 있고 해당 문서들은 
 각각 'idx'라는 property로 초기 인덱스를 가지고 있으므로 
 .idx를 통해 접근하여 location과 idx의 값이 같은 문서의 현재 인덱스에 +1
 */
  let result = queue.findIndex((e) => e.idx === location) + 1;
  console.log(result);
  return result;
}

solution([1, 1, 9, 1, 1, 1], 0);

키(priority): 중요도 키(idx): 초기 인덱스 위치 형태로 map을 통해 객체를 하나 만들어 주고 객체에서 하나씩 꺼내와 기준으로 지정해 some 메서드로 요소를 돌면서 기준 priority키의 값보다 큰 요소가 있는지 판별해 주었다 있다면 해당 문서보다 중요한 문서가 있다는 의미이므로 가장 뒤로 보내주고 없다면 프린터 해 주어야 하니까 큐에 쌓아주는 형식으로 풀이하였다. 이번 문제를 통해서 저번에 some과 every 메서드를 사용하고 싶었는데 사용해서 풀어서 기분이 좋다...

some은 요소를 순회하면서 하나라도 조건에 부합한다면 boolean 타입으로 true를 반환한다.
그와 반대로 every는 모든 요소가 부학해야 true를 반환하는 메서드이다.

❤️‍🔥 가장 가까운 같은 글자

/*
  nearer => 자신과 같은 글자 중 더 가까운 인덱스 차이를 뽑아오는 함수
  i => 기준 문자열의 인덱스 위치
  str => 비교할 문자열
  s => 원본 문자열  (str과 비교할 때 s[i]로 사용하기 위해 매개변수로 넘겨 줌)
*/
function nearer(i, str, s) {
  console.log(s);
  console.log(str);
  console.log(i);

  //? 기준 문자열의 인덱스 - 비교되는 문자열의 인덱스를 계속 push해서 그중 제일 거리가 작은 것을 리턴
  const nearbyIdx = [];
  for (let j = 0; j < str.length; j++) {
    if (str[j] === s[i]) {
      nearbyIdx.push(i - j);
      console.log(j);
    }
  }
  console.log(nearbyIdx);
  return Math.min(...nearbyIdx);
}

/*
! 맨 처음 문자열은 처음 나오는 것이기 때문에 result에 -1로 셋팅 후 시작
한 글자씩 순회하며 돌 때 처음부터 순회하고 있는 요소 앞까지 str로 잘라 
indexOf를 통해 
? 없다면 바로 -1를  push 해 주고 
? 있다면 순회하는 요소가 여러번 나올 경우를 대비해 더 가까운 인덱스를 뽑아주기 위해 nearer 함수 호출
*/
function solution(s) {
  const result = [-1];
  for (let i = 1; i < s.length; i++) {
    // slice니까 i 바로 앞에서 잘림
    const str = s.slice(0, i);
    str.indexOf(s[i]) === -1
      ? result.push(-1)
      : result.push(nearer(i, str, s));
    console.log(str);
  }

  console.log(result);
  return result;
}

solution('banana');

s의 맨처음 글자는 앞에 아무것도 없기 때문에 배열에 -1을 정해두고 for문을 1부터 돌게 해 주었다. 그리고 for문의 i가 돌때마다 처음부터 i의 바로 전까지 slice를 해준 문자열에 해당 s[i] 번째의 요소와 같은 게 있는지 indexOf를 통해서 확인해 준다. 만약 -1과 같다면 s[i]번째 앞에는 s[i]와 일치하는 문자가 없다는 의미이므로 -1를 push하고 아니라면 s[i]와 동일한 문자가 여러번 있을 경우를 대비해 s[i]와 가장 가까운 문자를 뽑아주는 nearer함수를 만들어 주어 str과 s와 i를 그대로 매개변수로 전달하여 해당하는 값이 있으면 해당 요소와 s[i]와의 인덱스 거리 차이를 계속 push 시켜 결과적으론 Math.min을 통해 가장 가까운 위치를 리턴으로 넘겨주어 완성시켰다!

0개의 댓글