스터디 기록 23

유아현·2023년 1월 9일
0

Study

목록 보기
24/27
post-thumbnail

❤️‍🔥 튜플

function solution(s) {

  /*
  1. 중괄호를 제거해 준다.
  2. 요소의 개수를 객체로 count 해 준다
  3. 요소 : 개수의 형태로 나온 객체의 값을 기준으로 sort 해 준다
  4. map을 통해 0번째에 있는 것은 키이므로 키만 뽑아 number 타입으로 변환한다
  */



  /*
  {{ }} 제거해 주게 되면 안에 있는 중괄호들이 남는데, 안의 중괄호(},{) 기준으로 나누면
  각 집합끼리 묶을 수 있음
  집한 내부에서도 각 요소끼리 나누어주기 위해 ','를 기준으로 나누어 준다
  */
 s = s.slice(2, s.length-2).split('},{');
 console.log(s)
 s = s.map((ele) => ele = ele.split(','))
 console.log(s)


 /*
 각 집합의 요소를 하나씩 돌면서 요소를 키로 갖는지 확인 후 
 ? 없으면 해당 요소를 키로 만들어 주고 (초기키 count는 1)
 ? 있으면 해당 요소의 키에 +1 시켜 주어
 ! 해당 요소들의 개수를 count 한다!
 */

 let result  = {}
  for(let i = 0 ; i < s.length ; i++){
    for(let j = 0 ; j < s[i].length ; j++){
      !result.hasOwnProperty(s[i][j]) ? result[s[i][j]] = 1 : result[s[i][j]] += 1;
    }
  }
  console.log(result)
  /*
  ! 키 => 요소
  ! 값 => 요소의 갯수
  값을 기준으로 sort를 해 주고
  결과는 키값만 가지고 와야 하고 
  타입은 number 타입이므로 map을 통해 첫번째 요소를 number로 형변환해 준 뒤 리턴
  */
  result = Object.entries(result).sort(([, a], [, b]) => b - a)
  console.log(result)

    result = result.map((ele) => ele = Number(ele[0]))
    console.log(result)

    return result;
  }
solution("{{20,111},{111}}")

하나의 문자열로 된 s를 각 묶음에 맞게 배열로 나누어 준 뒤, 배열들의 요소들을 하나씩 순회하면서 새로운 객체에 키로 만들어주면서 중복이 될 수 없게 해 준다 값으로는 해당 요소가 몇 번 나오는지에 대한 키의 count이다. 그래서 나오게 된 객체를 배열로 바꾸어 준 다음 1번째 인덱스의 있는 것은 각 요소가 몇 번 나오는 횟수이므로 1번째 인덱스 기준으로 정렬해 주어 map을 통해 number 타입으로 형변화를 해 준 뒤 리턴해 주었다. 좀 너무 먼길을 돌아 푼 느낌이 없지 않아 있는 느낌의 코드이다... 스터디 하면서 너무 꼬아서 푼 것 같아서 다른 분들의 코드를 재미있게 봤다 애초에 리턴값이 number 타입인데 고려하지 않고 하다가 마지막에야 눈치를 채고 map으로 형변환을 해 준것도 아쉽다. 미리 타입에 대해서 인지를 하고 변환한 상태에서 처리를 해 줬으면 좋았겠단 생각을 했다.

function solution(s) {

    const str = s.replaceAll('{', ' ').replaceAll("}", " ").split(", ")

    const arr =  str.map(el => {
        return el.trim().split(",");
    })

    arr.sort((a,b) => a.length - b.length)
    arr

    const answer =  []
    for(let el of arr) {
        el.map((e) => {
            if(!answer.includes(e)){
                answer.push(e)
            }
        })
    }


    return answer.map(el=> Number(el));
}

정호님의 코드 우선 replaceAll을 통해 괄호를 제거해 주고 split을 통해 . 기준으로 배열끼리 1차적으로 구분지어준 뒤에 map을 통해 trim을 사용하여 양옆 공백을 제거해 주고 배열 내의 요소끼리 나누어 주었다. 길이 순서로 정렬 후 바로 for of문 내에서 map을 돌면서 include를 써서 해당 요소가 없을 때만 넣어주면서 중복으로 들어가지 않게 해 주었다 한눈에 보기 깔끔해서 인상적이었다!

❤️‍🔥 기능개발

function solution(progresses, speeds) {

 /*
 앞에 기능이 배포가 됐는지
 배포 O => 나올 수 있음
 배포 X => 앞에 기능 나올 때 같이 나와야 됨

 전체 진도가 고정으로 100이니까 현재 진도를 뺀 나머지에 작업 속도를 나누면 일수
 
 */


  //? (완료 작업 진도 - 현재 작업 진도) / 작업 속도 = 작업 일수

  const workingDays = progresses.map((ele, idx) =>{
   return Math.ceil( (100 - ele) / speeds[idx])
  })

  console.log(workingDays)

  /* 
  ? 각 배포마다 몇 개의 기능이 배포되는지!!!!!

  기준 일수 뒤에 오는 넘이 현재 기준보다 작거나 같으면 동시 배포임
  ! 뒤에 오는 게 기준 일수와 같거나 작으면 해당 인덱스에 카운트 계속 해줌
  ! 그렇지 않으면 새로운 배포를 위해 기준 바뀌어야 함
  ? rssult의 인덱스를  전위 증감을 통해 새로운 배포 시즌에 기본값 1을 넣어줌

  */
  const result  = [0];
  let criteria = workingDays[0];
  for(let i = 0 , j = 0; i < workingDays.length ; i++){
    if(workingDays[i] <= criteria){
      result[j] += 1;
    }else{
      criteria = workingDays[i];
      result[++j] = 1;
    }
  }

  console.log(result)

  return result;
}
solution([93, 30, 55], [1, 30, 5])

(완료 작업 진도 - 현재 작업 진도) / 작업 속도 = 작업 일수 공식을 활용하여 먼저 작업의 일수를 구해서 기준으로 우선 0번째 작업 일수로 설정해 두고 순회를 하는데 뒤에 오는 작업 일수들이 현재 기준이 되는 작업일수보다 작거나 같은 경우에는 동시 배포가 가능한 경우므로 기준일수의 인덱스 j에 카운트하는 방식으로 풀이했다. 처음에 공식화를 하지 않고 무지성으로 풀려다가 시간낭비만 많이했다.... 공식을 찾고 나니까 나름 괜찮은 문제였다.

function solution(progresses, speeds) {
    var answer = [];

    // 배포까지 남은 일 수 계산
    let done = progresses.map((val, idx) => Math.ceil((100 - val)/speeds[idx]));
    console.log(done)

    // 가장 처음 배포되는 요소
    let first = done[0];
    console.log(done[0])

    // 
    let cnt = 0;
  // leftDays 배열을 차례로 순회하며 현재 배포일보다 이후에 배포되어야할 기능을 만나면 이전까지의 기능을 한번에 배포
  done.forEach((daysLeft) => {
    if (first < daysLeft) {
      first = daysLeft;
      answer.push(cnt);
      cnt = 0;
    }
    cnt++;
  });
  answer.push(cnt);

  // 정답 반환
  return answer;


    return answer;
}
solution([95, 90, 99, 99, 80, 99],[1, 1, 1, 1, 1, 1])

동원님의 코드 기준으로 잡고 비교하는 것도 공식을 활용해 풀이한 것 등 접근법은 비슷하지만 표현한 방식이 미묘하게 다르다. 나는 인덱스로 접근해서 count를 했다면 동원님은 기준이 되는 변수 first보다 크면(동시에 배포되지 않는 경우) 동시배포될 때(else의 경우) count 해 준 값을 push 해 주었다.

0개의 댓글