m x n
matrix grid
which is sorted in non-increasing order both row-wise and column-wise, return the number of negative numbers in grid
.m
== grid.length
n
== grid[i].length
m
, n
<= 100grid[i][j]
<= 100/**
* @param {number[][]} grid
* @return {number}
*/
var countNegatives = function(grid) {
const rowLength = grid.length;
let result = 0;
let rowArr, negativeIndex, negativeCount, colLength;
for (let i = 0; i < rowLength; i++) {
rowArr = grid[i];
colLength = rowArr.length;
negativeIndex = rowArr.findIndex(num => num < 0);
negativeCount = negativeIndex !== -1 ? colLength - negativeIndex : 0;
result += negativeCount;
}
return result;
};
nums
and an integer k
, return the k
most frequent elements. You may return the answer in any order.nums.length
<= 105nums[i]
<= 10^4k
is in the range [1, the number of unique elements in the array]
.Example 1
Example 2
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function(nums, k) {
const numMap = new Map();
nums.forEach((number) => {
numMap.set(number, (numMap.get(number) || 0) + 1);
});
const orderedNumArr = [...numMap.entries()].sort((a, b) => b[1] - a[1]).map(([number,_]) => number);
return orderedNumArr.slice(0, k);
};
0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
x = "0111010"
이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100"
이 됩니다.0과 1로 이루어진 문자열 s
가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s
에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
s
의 길이는 1 이상 150,000 이하입니다.s
에는 '1'이 최소 하나 이상 포함되어 있습니다.회차 | 이진 변환 이전 | 제거할 0의 개수 | 0 제거 후 길이 | 이진 변환 결과 |
---|---|---|---|---|
1 | "110010101001" | 6 | 6 | "110" |
2 | "110" | 1 | 2 | "10" |
3 | "10" | 1 | 1 | "1" |
회차 | 이진 변환 이전 | 제거할 0의 개수 | 0 제거 후 길이 | 이진 변환 결과 |
---|---|---|---|---|
1 | "01110" | 2 | 3 | "11" |
2 | "11" | 0 | 2 | "10" |
3 | "10" | 1 | 1 | "1" |
회차 | 이진 변환 이전 | 제거할 0의 개수 | 0 제거 후 길이 | 이진 변환 결과 |
---|---|---|---|---|
1 | "1111111" | 0 | 7 | "111" |
2 | "111" | 0 | 3 | "11" |
3 | "11" | 0 | 2 | "10" |
4 | "10" | 1 | 1 | "1" |
function solution(s) {
const convertToBinary = (numStr, zeroCount, operationCount) => {
if (numStr === '1') {
return [operationCount, zeroCount];
}
const naturalNumber = numStr.split('').filter((num) => {
if (num === '0') {
zeroCount += 1;
return false;
}
return true;
}).join('');
const binaryNumber = naturalNumber.length.toString(2);
operationCount += 1;
return convertToBinary(binaryNumber, zeroCount, operationCount);
};
return convertToBinary(s, 0, 0);
}
무지는 단순한 문자 코드 순이 아닌, 파일명에 포함된 숫자를 반영한 정렬 기능을 저장소 관리 프로그램에 구현하기로 했다.
소스 파일 저장소에 저장된 파일명은 100 글자 이내로, 영문 대소문자, 숫자, 공백(" "), 마침표("."), 빼기 부호("-")만으로 이루어져 있다. 파일명은 영문자로 시작하며, 숫자를 하나 이상 포함하고 있다.
파일명은 크게 HEAD, NUMBER, TAIL의 세 부분으로 구성된다.
파일명 | HEAD | NUMBER | TAIL |
---|---|---|---|
foo9.txt | foo | 9 | .txt |
foo010bar020.zip | foo | 010 | bar020.zip |
F-15 | F- | 15 |
파일명을 세 부분으로 나눈 후, 다음 기준에 따라 파일명을 정렬한다.
무지를 도와 파일명 정렬 프로그램을 구현하라.
files
가 주어진다.files
는 1000 개 이하의 파일명을 포함하는 문자열 배열이다.muzi1.txt
, MUZI1.txt
, muzi001.txt
, muzi1.TXT
는 함께 입력으로 주어질 수 있다.)function solution(files) {
files.sort((a, b) => {
const firstFileNames = tokenizeFileName(a);
const secondFileNames = tokenizeFileName(b);
return compare(firstFileNames, secondFileNames);
});
return files;
}
function tokenizeFileName(fileName) {
let startIndex = 0;
let endIndex = 0;
for (let index = 0; index < fileName.length; index++) {
if (!startIndex && !isNaN(parseInt(fileName[index]))) {
startIndex = index;
}
if (startIndex && isNaN(parseInt(fileName[index + 1]))) {
endIndex = index;
break;
}
}
const HEAD = fileName.slice(0, startIndex);
const NUMBER = fileName.slice(startIndex, endIndex + 1);
return [HEAD.toUpperCase(), parseInt(NUMBER)];
}
function compare(firstFileNames, secondFileNames) {
const [firstHead, firstNumber] = firstFileNames;
const [secondHead, secondNumber] = secondFileNames;
if (firstHead < secondHead) {
return -1;
} else if (firstHead > secondHead) {
return 1;
} else {
return firstNumber - secondNumber;
}
}
function solution(files) {
files.sort((a, b) => {
const aHead = a.match(/^\D+/)[0].toLowerCase();
const bHead = b.match(/^\D+/)[0].toLowerCase();
if (aHead < bHead) {
return -1;
}
if (aHead > bHead) {
return 1;
}
const aNumber = Number(a.match(/\d+/)[0]);
const bNumber = Number(b.match(/\d+/)[0]);
return aNumber - bNumber;
});
return files;
}