[Level1] 8. 36 ~ 40




하루 세문제씩 꾸준히 풀기! 였으나 문제가 너무 쉬워서 5개를 풀어보겠다😂


36. 나머지가 1이 되는 수 찾기

프로그래머스

function solution(n) {
  let cnt = 1;
  while (1) {
    if (n % cnt === 1) return cnt;
    cnt++;
  }
}

우와. 베스트풀이랑 똑같다!
다만 맨날 헷갈리는 걸 한번만 짚고 가자

best 풀이

function solution(n) {
  let cnt = 1;
  while (cnt++) {
    if (n % cnt === 1) return cnt;
  }
}

베스트풀이법대로 내 코드를 바꿔봤다.
while 조건절에 증감문을 포함시키기!



37. 문자열 내림차순으로 배치하기

programmers

function solution(s) {
    return s.split('').sort().reverse().join('');
}

굿굿!
대문자인지 비교하고 싶을 때는 s[i] === s[i].toUpperCase() 를 활용하면 된다!



38. 다트게임

programmers

function solution(dartResult) {
  let arr = dartResult.split("");
  let temp = [];
  for (let i = 0; i < arr.length - 1; i++) {
    if (arr[i] === "1" && arr[i + 1] === "0") {
      arr.splice(i, 2, 10);
    }
  }
  for (let i = 0; i < arr.length; i++) {
    if (Number.isFinite(arr[i])) continue;
    if (arr[i] === "S") {
      temp.push(Math.pow(arr[i - 1], 1));
    } else if (arr[i] === "D") {
      temp.push(Math.pow(arr[i - 1], 2));
    } else if (arr[i] === "T") {
      temp.push(Math.pow(arr[i - 1], 3));
    } else if (arr[i] === "*") {
      if (temp.length >= 2) {
        temp[temp.length - 1] = temp[temp.length - 1] * 2;
        temp[temp.length - 2] = temp[temp.length - 2] * 2;
      } else {
        temp[temp.length - 1] = temp[temp.length - 1] * 2;
      }
    } else if (arr[i] === "#") {
      temp[temp.length - 1] = temp[temp.length - 1] * -1;
    }
  }
  return temp.reduce((prev, value) => prev + value, 0);
}

흐어,, 풀이 과정이 더 깔끔한게 분명 있을 것 같고 (애증의 정규식,…!!)
10인경우를 저렇게 밖에 할 수 없는지가 의문이다…


best 풀이

function solution(dartResult) {
    const bonus = { 'S': 1, 'D': 2, 'T': 3 },
          options = { '*': 2, '#': -1, undefined: 1 };

    let darts = dartResult.match(/\d.?\D/g);

    for (let i = 0; i < darts.length; i++) {
        let split = darts[i].match(/(^\d{1,})(S|D|T)(\*|#)?/),
            score = Math.pow(split[1], bonus[split[2]]) * options[split[3]];

        if (split[3] === '*' && darts[i - 1]) darts[i - 1] *= options['*'];

        darts[i] = score;
    }

    return darts.reduce((a, b) => a + b);
}

정규식을 이용하기 위해 match를 사용했다.
정규식 공부한 후에 다시 한번 참고해보자!



39. 8주차 최소직사각형

programmers

function solution(sizes) {
  for (let i = 0; i < sizes.length; i++) {
    sizes[i].sort((x, y) => x - y);
  }
  let wMax = Number.MIN_SAFE_INTEGER;
  let hMax = Number.MIN_SAFE_INTEGER;
  for (let i = 0; i < sizes.length; i++) {
    if (sizes[i][0] > wMax) wMax = sizes[i][0];
    if (sizes[i][1] > hMax) hMax = sizes[i][1];
  }
  return wMax * hMax;
}


best 풀이

function solution(sizes) {
    let w = 0;
    let h = 0;
    sizes.forEach(s => {
        const [a, b] = s.sort((a,b) => a-b);
        if (a > h) h = a;
        if (b > w) w = b;
    });

    return w * h;
}

2차원 배열에 접근할 때 풀 수 있는 좋은 방법같다.
forEach로 하나한 접근해서 하나하나 sort 하기…
직관적이고 너무 좋당..
다만 sort를 여러번하니 시간복잡도 측면에서는 내 코드가 더 좋을 것 같다!




40. 서울에서 김서방 찾기

programmers

function solution(seoul) {
  return `김서방은 ${seoul.indexOf("Kim")}에 있다`
}

너무 쉽자나…! 빨리 1단계 끝내야겠다..
best 풀이도 나와 같은데 이 코드를 보고 사람들이 감탄하는걸 보면서 뿌듯함을 느낀다.
확실히 한달 전의 나보다 실력이 많이 늘었다!!👍👍