[Level2] 21. 90 ~ 92




90. 이진변환 반복하기

프로그래머스

function solution(s) {
  let zero = 0;
  let cnt = 0;
  while (s !== "1") {
    if (s.match(/0/g)) {
      zero += s.match(/0/g).length;
    }
    s = s.match(/1/g).length.toString(2);
    cnt++;
  }
  return [cnt, zero];
}

동연님 코드

function solution(s) {
    // [이진변환 횟수, 제거된 0의 갯수]
    const answer = [0, 0];

    let str = s;
    // 마지막은 항상 1이다.
    while(str.length > 1){
        // 1의 갯수 초기화
        let countOne = 0;
        // 문자열은 이터레이터 for... of
        for(const el of str){
            // 1의 갯수 세기
            if(el == '1') countOne++;
        }
        // 전체 길이에서 1의 갯수만큼 뺀 값 => 0의 갯수
        answer[1] += str.length-countOne;
        // 1의 갯수를 이진수로 변환하여 재할당
        str = countOne.toString(2)
        // 변환 횟수 증가
        answer[0]++;
    }
    return answer;
}

오랜만에 만나는 문자열 찾기여서 정규식을 사용했다.!
러버덕으로 동연님의 코드도 볼 수 있었는데, while문을 사용하는 건 같지만 정규식을 사용하지 않으시고,
for…of 로 문자열 s의 1의 개수를 컨트롤 하셨다.
저번부터 느꼈는데, 알고리즘을 푸실때마다 주석을 생활화하신게 멋있으시다. (나는 귀찮은데…😭)
또한 return을 위해 내가 만든 cnt, zero대신 미리 answer[0,0]을 할당하는것도 새로운 방법인 것 같다.



91. 순위검색 (미완성)

프로그래머스

function solution(info, query) {
  let answer = [];
  let info_arr = [];
  let query_arr = [];
  let length = info.length;
  for (let i = 0; i < length; i++) {
    info_arr[i] = info[i].split(" ");
    query_arr[i] = query[i].replace(/ and/g, "").split(" ");
  }
  for (let i = 0; i < length; i++) {
    for (let j = 0; j < length; j++) {
      query_arr[i][j];
    }
  }
  for (let i = 0; i < length; i++) {
    let cnt = 0;
    for (let j = 0; j < length; j++) {
      for (let k = 0; k < 4; k++) {
        if (query_arr[i][k] == info_arr[j][k] || query_arr[i][k] == "-") {
          if (k == 3 && query_arr[i][4] * 1 <= info_arr[j][4] * 1) {
            cnt++;
          }
        } else {
          break;
        }
      }
    }
    answer.push(cnt);
  }
  return answer;
}

let info = [
  "java backend junior pizza 150",
  "python frontend senior chicken 210",
  "python frontend senior chicken 150",
  "cpp backend senior pizza 260",
  "java backend junior chicken 80",
  "python backend senior chicken 50",
];
let query = [
  "java and backend and junior and pizza 100",
  "python and frontend and senior and chicken 200",
  "cpp and - and senior and pizza 250",
  "- and backend and senior and - 150",
  "- and - and - and chicken 100",
  "- and - and - and - 150",
];
console.log(solution(info, query));
//[ 1, 1, 1, 1, 2, 4 ]

오우 너무 어렵다…
테스트코드는 정답이었는데, 런타임에러가 났다(3중 for문이어서ㅠ)
찾아보니 조합과 이분탐색으로 풀어야한다고한다..ㅠ
다음에 다시 도전하기!



92. 괄호 변환

프로그래머스

function solution(p) {
  let open = 0;
  let close = 0;
  let stack = [];
  let u, v;
  let i = 0;

  if (p === "") return p;

  do {
    if (p[i] === "(") {
      open++;
      stack.push("(");
    } else {
      close++;
      if (stack[stack.length - 1] === "(") stack.pop();
    }
    i++;
  } while (open !== close);

  u = p.slice(0, i);
  v = p.slice(i);

  if (!stack.length) return u + solution(v);
  else {
    u = u
      .slice(1, u.length - 1)
      .replace(/\(|\)/g, (s) => (s === "(" ? ")" : "("));
    v = `(${solution(v)})`;
  }

  return v + u;
}

문제에서 푸는 알고리즘을 모두 알려줬음에도 놀랍게도 오래걸렸다…ㅋㅋㅋ
지금 너무 호율성 좋게 코딩하려고 시작도 못하는 현상을 겪고 있는데,
효율성은 나중에 따지고 우선 어떻게든 동작이라도 하는 코드를 만들어보자!!
이제는 재귀가 어느정도 익숙해진 것 같다. 👍👍