twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면,
더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열
예를 들어,
nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열
예를 들어,
nums은 [4, 9, 11, 14]
target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.
가정
target으로 보내는 합계의 조합은 배열 전체 중에 2개 밖에 없다고 가정하겠습니다.
<script>
const twoSum = (nums, target) => {
for (let i = 0; i < nums.length; i++) {
for(let j = 1; j < i; j++) {
if ( nums[i]+nums[j] === target) {
return [i, j];
}
}
}
}
</script>
먼저 twoSum 함수의 숫자 배열을 for문을 사용하여 돌려줘야 한다고 생각했습니다.
nums에서 2개의 수를 빼내와 더해줘야 하기 때문에 for문을 2개 만들어주었고, return 될 배열의 index 0의 자리는 nums[0]값 부터, return 될 배열의 index 1의 자리는 nums[1]부터 시작하도록 성정하였습니다.
또한 j는 i보다 작을 때에만 for을 돌리므로 i < j로 조건을 설정하였습니다.(하지만 값이 끊임없이 나오기 때문에 비효율적인 문제가 있습니다.)
<script>
const twoSum = (nums, target) => {
for (let i = 0; i < nums.length - 1; i++) {
for(let j = i + 1; j < nums.length ; j++) {
if ( nums[i]+nums[j] === target) {
return [i, j];
}
}
}
}
</script>
또한 첫 번재 for 구문에 nums.length에 -1을 주었는데 -1을 주지 않아도 값은 나오지만
const nums= [4, 9, 11, 14];
const target = 13; 로 가정했을 때,
4 9
4 11
4 14
9 9
9 11
9 14
11 9
11 11
11 14
4 9
4 11
4 14
9 9
9 11
9 14
11 9
11 11
11 14
14 9 ❗️
14 11 ❗️
14 14 ❗️
(중복 값까지 출력 됨)
reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.
x: 숫자
return: 뒤집어진 숫자를 반환!
예들 들어,
x: 1234
return: 4321
x: -1234
return: -4321
x: 1230
return: 321
<script>
const reverse = x => {
str = x.toString().split('').reverse();
console.log(str)
if (str[str.length-1] == '-'){
str.pop();
str.unshift('-')
} return Number(str.join(''));
}
console.log(reverse(-1234));
</script>
1234
->4321
1230
-> 321
-1234
->4321-
이렇게 마이너스 값은 마이너스까지 뒤로 가버림.=> 해결 방법
x가 뒤집은 배열의 모양일 때 -
를 빼서 앞에 붙이자.
[String to Array]
split() 메서드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눕니다.
[Array to String]
join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만듭니다.
const elements = ['Fire', 'Air', 'Water'];
console.log(elements.join());
// expected output: "Fire,Air,Water"
console.log(elements.join(''));
// expected output: "FireAirWater"
console.log(elements.join('-'));
// expected output: "Fire-Air-Water"
typeof
숫자로 이루어진 배열인 nums를 인자로 전달합니다.
숫자중에서 과반수(majority, more than a half)가 넘은 숫자를 반환해주세요.
예를 들어,
nums = [3,2,3]
return 3
nums = [2,2,1,1,1,2,2]
return 2
nums = [3,2,3]
return 3
nums = [2,2,1,1,1,2,2]
return 2
가정
nums 배열의 길이는 무조건 2개 이상
구체적인 case를 정하고 일반화하기.
[1, 2, 1, 2, 1]
nums를 [1, 2, 1, 2, 1]이라고 가정하고 문제에 접근하겠습니다.
배열 nums가 [1, 1, 1, 2, 2]이런 모양으로 되어있으면 가운데 값을 기준으로 반을 나누면 과반수인 값을 찾을 수 있습니다.
sort 함수를 사용하면
function moreThanHalf(nums) {
const sortArr = nums.sort();
}
여기서 (sortArr.length-1)/2를 구해보면 가운데 있는 1의 인덱스 값, 2가 나옵니다. 그럼 1이 과반수를 넘은 것임을 알게 됩니다.
function moreThanHalf(nums) {
const sortArr = nums.sort();
return sortArr[(sortArr.length-1)/2];
}
그런데 이럴 경우에는 배열의 길이가 홀수 일 때만 적용이 됩니다. 만약 [1, 1, 1, 2, 2, 3]일 경우에는 배열의 길이가 소수로 나오겠죠?
따락서 배열의 길이가 홀수일 때, 짝수일 때로 조건을 나눠서 값을 return 나오도록 하겠습니다.
[1, 1, 2, 2, 2, 2]sortArr.length/2-1
function moreThanHalf(nums) {
const sortArr = nums.sort();
if(sortArr.length % 2 == 1){
return sortArr[(sortArr.length-1)/2];
}else if (sortArr.length % 2 == 0){
return sortArr[sortArr.length/2-1];
}
}
nums는 숫자로 이루어진 배열입니다.
가장 자주 등장한 숫자를 k 개수만큼 return해주세요.
nums = [1,1,1,2,2,3],
k = 2
return [1,2]
nums = [1]
k = 1
return [1]
<script>
function topK(nums, k) {
let obj = {};
for( let i in nums) {
nums[i] in obj ? obj[nums[i]] += 1 : obj[nums[i]] = 1;
}
let sorted = Object.keys(obj).sort(function(a, b) {
return obj[b] - obj[a]
})
return sorted.slice(0, k).map(x => parseInt(x))
}
</script>
<script>
const Arr = [1, 8, 6, 2, 5, 4, 8, 3, 7];
function getMaxArea(Arr) {
const areas = [];
for(let i = 0; i < Arr.length -1 ; i++) {
for(let j = i+1; j < Arr.length; j++) {
const width = i - j;
const widthX = Math.abs(width);
const heightY = Arr[i] < Arr[j] ? Arr[i] : Arr[j];
const area = widthX*heightY;
areas.push(area);
}
}
return areas.sort((a,b)=>b-a)[0]
}
getMaxArea(Arr);
</script>
<script>
function getMaxArea(h) {
result= [];
for (let i =0; i<h.length ; i++ ){
for (let j = 0; j<h.length; j++){
if(j===i) continue;
if(h[i]>=h[j]){
result.push( h[j]*(Math.abs(j-i)) )
}else{
result.push( h[i]*(Math.abs(j-i)) )
}
}
}
return result.sort((a,b)=>b-a)[0]
}
getMaxArea([1, 8, 6, 2, 5, 4, 8, 3, 7] ) ==> 49
</script>
https://github.com/rumbarum/CodeKata/blob/master/Week2_Day5.md