난이도 : Level. 2
언어 : Javascript
출제 내역 : 연습문제
땅따먹기
- 땅따먹기 게임에서 가장 높은 점수는?
function solution(land) {
let result = Math.max(...land[0])
let standard = land[0].indexOf(result)
for (let i = 1; i<land.length; i++) {
land[i][standard] = 0;
let nextNum = Math.max(...land[i])
result = result + nextNum;
standard = land[i].indexOf(nextNum)
}
return result;
}
기존에 사용한 코드로는 테스트 문제는 해결 됐지만,
제출한 코드에서는 전부 맞지 않는 현상이 벌어졌습니다.
중복된 값이 있는 행이 있을 경우 때문인데요
그래서 코드를 좀 수정해 보았습니다.
function solution(land) {
for (let i = 1; i<land.length; i++) {
land[i][0] += Math.max(land[i-1][1],land[i-1][2],land[i-1][3])
land[i][1] += Math.max(land[i-1][0],land[i-1][2],land[i-1][3])
land[i][2] += Math.max(land[i-1][0],land[i-1][1],land[i-1][3])
land[i][3] += Math.max(land[i-1][0],land[i-1][1],land[i-1][2])
}
const result = land[land.length-1].sort((a,b) => a-b)
return result[result.length-1]
}
중복되는 인덱스의 값은 더할 수 없기 때문에
해당 인덱스를 제외한 값 중 가장 큰 값을 다음 배열 값에 더해줍니다.
그렇게 해서 나온 마지막 배열에서 가장 큰 값을 결과값으로 해줍니다.
올바른 괄호
- 올바른 괄호가 있는 문자열인지 확인
기존에 풀었던 알고리즘 문제 중 비슷한 문제가 있어
replace
를 활용한 방법으로 문제를 해결했는데,
정확도에서는 맞았지만, 효율성에서는 통과를 못해 다른 방법을 택했습니다.
function solution(s) {
const arr = s.split("");
let t = 0;
for (let i=0; i<arr.length; i++) {
if (arr[i] == "(") {
t++;
} else {
t--;
}
if (t < 0) {
break;
}
}
return t == 0 ? true : false;
}
먼저 주어진 문자열을 배열로 만들고,
0이 되면 올바른 괄호라고 판단하는 반복문을 만드는데,
이 때, 시작하는 문자가 닫히는 것으로 시작하면
바로 false
를 출력하도록 하도록 구성한다.
다음 큰 숫자
- 어떤 수를 2진법으로 변경했을 때, 같은 1의 갯수가 있는 다음 큰 숫자 찾기
const checkNum = (num) => {
const ones = num.toString(2).split('').filter(data => data === "1")
return ones.length
}
우선 이진법으로 변경한 부분에서 1의 갯수가 몇개 인지를 아는
함수를 하나 만들어 둡니다.
function solution(n) {
let standard = checkNum(n)
for (let i = n+1; i < n**2; i++) {
if (standard === checkNum(i)) {
return i;
break;
}
}
}
그 후, 기준이 되는 변수를 하나 만들어 주고,
반복문을 이용해 조건과 일치하는 숫자를 도출해 줍니다.