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