728x90
1. 같은 숫자는 싫어
(1) 1번 풀이
function solution(arr) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] == arr[i + 1]) {
arr.splice(i, 1);
i--;
}
}
return arr;
}
효율성 테스트 시간초과
splice로 계속 접근해서 시간이 더 걸린것같다.
(2) 2번 풀이
function solution(arr) {
let answer = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] != arr[i + 1]) {
answer.push(arr[i]);
}
}
return answer;
}
(3) 다른사람 풀이 본 후
function solution(arr) {
return arr.filter((val, index) => val != arr[index + 1]);
}
filter 메서드를 사용함
2. 숫자의 표현
function solution(n) {
var answer = 1;
const startNum = Math.ceil(n / 2);
for (let i = startNum; i > 0; i--) {
let temp = i;
for (let j = i - 1; j > 0; j--) {
temp += j;
if (temp == n) {
answer += 1;
} else if (temp > n) {
break;
}
}
}
return answer;
}
3. 피보나치 수
function solution(n) {
let answer = [0, 1];
for (let i = 2; i <= n; i++) {
answer[i] = BigInt(BigInt(answer[i - 1]) + BigInt(answer[i - 2]));
}
return answer[n] % BigInt(1234567);
}
처음에 재귀로 시도 했다가 런타임 오류
그리고 BigInt 없이 풀었는데 계속 실패
실패한 이유를 고민하다가 재귀로 실패한 지점에서 계속 실패하길래 number최댓값을 초과한 값이 나온다고 생각
구글링해서 BigInt를 알게됐고 이건 수의 제한이 없다는 것을 알았다.
4. 이상한 문자 만들기
(1) 1번 풀이
function solution(s) {
var answer = [];
s.split(" ").reduce((acc, cur) => {
for (let i = 0; i < cur.length; i++) {
if (i % 2) {
cur =
cur.substring(0, i) +
cur.charAt(i).toLowerCase() +
cur.substring(i + 1);
} else {
cur =
cur.substring(0, i) +
cur.charAt(i).toUpperCase() +
cur.substring(i + 1);
}
}
answer.push(cur);
}, "");
return answer.join(" ");
}
(2) 2번풀이
function solution(s) {
var answer = [];
s.split(" ").reduce((acc, cur) => {
let temp = "";
for (let i = 0; i < cur.length; i++) {
if (i % 2) {
temp += cur[i].toLowerCase();
} else {
temp += cur[i].toUpperCase();
}
}
answer.push(temp);
}, "");
return answer.join(" ");
}
1번풀이를 좀더 가독성 좋게 해봤다.
(3) 다른 사람 풀이 본 후
function toWeirdCase(s) {
return s.toUpperCase().replace(/(\w)(\w)/g, function (a) {
return a[0].toUpperCase() + a[1].toLowerCase();
});
}
replace에서 두번째 파라미터로 콜백을 넣어줄수 있다는 것을 알게 됐다.
콜백의 매개변수로는 첫번째 매개변수에 만족하는 값이 들어간다.
5. 3진법 뒤집기
(1) 1번 풀이
function solution(n) {
var answer;
answer = n.toString(3).split("").reverse().join("");
return +parseInt(answer, 3).toString(10);
}
(2) 다른사람 풀이 본 후
function solution(n) {
var answer;
answer = parseInt(n.toString(3).split("").reverse().join(""), 3);
return answer;
}
parseInt의 뒤에 진수를 입력하면 10진수 number형으로 반환해준다 좀더 간단하게 바꿈
6. 예산
function solution(d, budget) {
var answer = 0;
d = d.sort((a, b) => a - b);
let temp = 0;
for (const value of d) {
temp += value;
if (temp > budget) {
break;
}
answer += 1;
}
return answer;
}
7. 다음 큰 숫자
(1) 풀이
function solution(n) {
const biN = n.toString(2).split("");
let numN = 0;
for (const val of biN) {
numN += +val ? 1 : 0;
}
let i = 1;
while (true) {
const temp = (n + i).toString(2).split("");
let tempNum = 0;
for (const val of temp) {
tempNum += +val ? 1 : 0;
}
if (tempNum == numN) {
return n + i;
}
i++;
}
}
(2) 다른사람 풀이 본 후
function solution(n, a = n + 1) {
return n.toString(2).match(/1/g).length == a.toString(2).match(/1/g).length
? a
: solution(n, a + 1);
}
match를 이용해서 훨씬 가독성 좋은 코드가 됐다.
8. 카펫
(1) 1번풀이
function solution(brown, yellow) {
const total = brown + yellow;
for (let i = brown / 2 - 1; i > 0; i--) {
for (let k = i; k > 0; k--) {
if (i * k == total && (i - 2) * (k - 2) == yellow) {
return [i, k];
}
}
}
}
(2) 2번풀이
function solution(brown, yellow) {
const total = brown + yellow;
for (let i = brown / 2 - 1; i > 0; i--) {
if (total % i == 0 && (i - 2) * (total / i - 2) == yellow) {
return [i, total / i];
}
}
}
2중 for문을 없애기 위해 코드를 다시 짜봤다.
728x90
'개발 > 알고리즘' 카테고리의 다른 글
[코딩테스트] 프로그래머스 문제 (0) | 2022.09.29 |
---|---|
[BigO] 객체와 배열 (1) | 2022.09.29 |
[코딩테스트] 올바른 괄호 (0) | 2022.09.28 |
[BigO] BigO 표기법 (0) | 2022.09.26 |
[코딩테스트] 최대공약수와 최소공배수 (0) | 2022.09.20 |