문제
twoSum함수에 숫자배열과 '특정 수'를 인자로 넘기면,
더해서 '특정 수'가 나오는 index를 배열에 담아 return해 주세요.
nums: 숫자 배열
target: 두 수를 더해서 나올 수 있는 합계
return: 두 수의 index를 가진 숫자 배열
예를 들어,
nums은 [4, 9, 11, 14]
target은 13
nums[0] + nums[1] = 4 + 9 = 13 이죠?
그러면 [0, 1]이 return 되어야 합니다.
내 풀이 방식
const twoSum = (nums, target) => {
let resultArr = [];
for (let i in nums) {
let findNum = Math.abs(target - nums[i]);
if (nums.indexOf(findNum) !== -1 && nums.indexOf(findNum) !== Number(i)) {
resultArr.push(Number(i), nums.indexOf(findNum));
return resultArr;
}
}
}
let numArr = [4, 9, 11, 14];
console.log(twoSum(numArr, 13));
또는
const twoSum = (nums, target) => {
for (let i in nums) {
let findNum = Math.abs(target - nums[i]);
if (nums.indexOf(findNum) !== -1 && nums.indexOf(findNum) !== Number(i)) {
return [Number(i), nums.indexOf(findNum)];
}
}
}
let numArr = [4, 9, 11, 14];
console.log(twoSum(numArr, 13));
짝궁 솔미님
const twoSum = (nums, target) => {
for(let i in nums) {
let j = i + 1;
for(let j in nums){
if(nums[i] + nums[j] === target) {
return [Number(i), Number(j)];
}
}
}
}
솔루션 가이드
function 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];
}
}
}
}
문제
reverse 함수에 정수인 숫자를 인자로 받습니다.
그 숫자를 뒤집어서 return해주세요.
x: 숫자
return: 뒤집어진 숫자를 반환!
예들 들어,
x: 1234
return: 4321
x: -1234
return: -4321
x: 1230
return: 321
풀이 - 1
const reverse = x => {
if (x >= 0) {
return Number(x.toString().split("").reverse().join(""));
} else {
let absNum = Math.abs(x);
return Number(absNum.toString().split("").reverse().join("")) * -1;
}
}
console.log(reverse(-1234));
풀이 - 2
const reverse = x => {
let returnNum = parseInt(x.toString().split("").reverse().join(""));
return x >= 0 ? returnNum : -returnNum;
}
console.log(reverse(-1234));
model solution
function reverse(x) {
let minus = false;
if (x < 0) {
x *= -1;
minus = true;
}
let numText = x.toString();
let result = '';
for (let i = numText.length-1; i >= 0; i--) {
result += numText[i];
}
result = minus ? result * -1 : Number(result);
return result;
}
String 형인 str 인자에서 중복되지 않은 알파벳으로 이루어진 제일 긴 단어의 길이를 반환해주세요.
str: 텍스트
return: 중복되지 않은 알파벳 길이 (숫자 반환)
예를 들어,
str = "abcabcabc"
return은 3
=> 'abc' 가 제일 길기 때문
str = "aaaaa"
return은 1
=> 'a' 가 제일 길기 때문
str = "sttrg"
return은 3
=> 'trg' 가 제일 길기 때문
내 답
const getLengthOfStr = str => {
let findStr = [];
let findLength = [];
let findIndexStart = 0;
let findIndexLast = str.length-1
// 앞에서 부터
for (let i = findIndexStart; i < str.length; i++) {
if (findStr.indexOf(str[i]) === -1) {
findStr.push(str[i]);
} else {
findIndexStart = i
findLength.push(findStr.length)
findStr = findStr.splice(findStr.length)
findStr.push(str[i])
}
}
findLength.push(findStr.length);
// 뒤에서 부터
for (let i = findIndexLast; i >= 0; i--) {
if (findStr.indexOf(str[i]) === -1) {
findStr.push(str[i]);
} else {
findIndexLast = i
findLength.push(findStr.length)
findStr = findStr.splice(findStr.length) // i+1 해도 같은 결과
findStr.push(str[i])
}
}
findLength.push(findStr.length);
//최종 값 구하기
return Math.max.apply(null, findLength);
}
console.log(getLengthOfStr("abcabcabc"));
console.log(getLengthOfStr("aaaaa"));
console.log(getLengthOfStr("sttrg"));
console.log(getLengthOfStr("abcdefghcijklmnop"));
내 답 결과
3
1
3
14
엄청 복잡하게 풀었다
맨처음에 앞 쪽에서 순차적으로 짤랐을때만 생각했는데 오류가 떠서 확인해보니
뒤 쪽에서도 짜른거로 검사해봐야된다는걸 알았다
1. 중복없는 단어를 넣기 위한 빈 배열 선언
2. 맨 처음 배열의 길이를 구하는 빈 배열 선언
3. 앞쪽 반복문 시작하는 숫자 변수 선언, 뒤쪽 반복문 시작하는 숫자 변수 선언
4. 단어 앞에서 부터 비교 시작
5. 맨처음 반복을 시작할 숫자는findIndexStart = 0
시작해서 단어의 길이보다 작을때까지 반복
6. 값을 비교할 맨처음 빈 배열에서 단어의 i번째 요소가 배열에 없으면
7. 중복없는 단어 배열에 추가
8. 중복없는 단어 배열에 중복값이 생기면 else 블록으로 넘어와서
9. 다시 반복문 시작 숫자는 중복인 요소의 index로 재할당
10. 지금까지 중복 없는 단어 배열의 길이를 길이 배열에 추가
11. 중복없는 단어 배열 slice 함수로 초기화 아직 잘모르겠다 할때마다 값이 바뀜...
12. 초기화된 중복없는 단어 배열에 중복값이없던 요소 추가
13. 중복값 다음 요소부터 다시 반복 시작
14. 똑같은 방식으로 진행해서 단어 앞에서 부터의 길이를 구한 배열과,
15. 단어 뒤에서 부터의 길이를 구한 배열의 최대값을 return
솔루션 모델
function getLengthOfStr(s) {
let strArr = [];
let prevStrArr = [];
console.log(s)
for (let i = 0; i < s.length; i++) {
console.log('=======================', i);
let ss = s.slice(i, i+1);
console.log(' 검사 ss ==> ', ss);
for (let j = 0; j < strArr.length; j++) {
if (ss === strArr[j]) {
if (prevStrArr.length < strArr.length) {
prevStrArr = strArr.slice();
console.log('prevStrArr에 저장', prevStrArr);
}
strArr = strArr.splice(j+1, strArr.length);
console.log('자르고 다시 시작 strArr', strArr, j)
//splice arr 자르는 함수
break;
}
}
strArr.push(ss);
console.log('추가한 후 strArr', strArr);
}
return Math.max(strArr.length, prevStrArr.length);
}
console.log(getLengthOfStr('taaaytts'));
솔루션 모델 결과
taaaytts
======================= 0
검사 ss ==> t
추가한 후 strArr [ 't' ]
======================= 1
검사 ss ==> a
추가한 후 strArr [ 't', 'a' ]
======================= 2
검사 ss ==> a
prevStrArr에 저장 [ 't', 'a' ]
자르고 다시 시작 strArr [] 1
추가한 후 strArr [ 'a' ]
======================= 3
검사 ss ==> a
자르고 다시 시작 strArr [] 0
추가한 후 strArr [ 'a' ]
======================= 4
검사 ss ==> y
추가한 후 strArr [ 'a', 'y' ]
======================= 5
검사 ss ==> t
추가한 후 strArr [ 'a', 'y', 't' ]
======================= 6
검사 ss ==> t
prevStrArr에 저장 [ 'a', 'y', 't' ]
자르고 다시 시작 strArr [] 2
추가한 후 strArr [ 't' ]
======================= 7
검사 ss ==> s
추가한 후 strArr [ 't', 's' ]
3
숫자인 num을 인자로 넘겨주면, 뒤집은 모양이 num과 똑같은지 여부를 반환해주세요.
num: 숫자
return: true or false (뒤집은 모양이 num와 똑같은지 여부)
예를 들어,
num = 123
return false
=> 뒤집은 모양이 321 이기 때문
num = 1221
return true
=> 뒤집은 모양이 1221 이기 때문
num = -121
return false
=> 뒤집은 모양이 121- 이기 때문
num = 10
return false
=> 뒤집은 모양이 01 이기 때문
내답
const sameReverse = num => {
let reverseNum = num.toString().split("").reverse().join("");
return (num.toString() === reverseNum) ? true : false;
}
//sameReverse(123);
//sameReverse(1221);
//sameReverse(-121);
sameReverse(10);
결과
false
- 비교할 변수에
- 인자로 전달받은 숫자를 문자로 변환, 자르고, 뒤집어서, 합친뒤 비교 변수에 할당
- 정확한 검사를 위해
- 인자로 전달받은 숫자를 문자로 변환시켜 비교 변수와 같으면 true 반환 다르면 false 반환
모델 솔루션
function sameReverse(num) {
let xStrArr = (num + '').split('');
let strLength = xStrArr.length;
let arr = [];
for (let i = 0; i < strLength; i++) {
arr.push(xStrArr.pop());
}
console.log(Number(arr.join('')))
return num === Number(arr.join(''));
}
console.log(sameReverse(1234567887654321));
모델 솔루션 결과
1234567887654321
true
strs은 단어가 담긴 배열입니다.
공통된 시작 단어(prefix)를 반환해주세요.
예를 들어
strs = ['start', 'stair', 'step']
return은 'st'
strs = ['start', 'wework', 'today']
return은 ''
솔미님 답
const getPrefix = strs => {
let prefix = strs[0];
if(strs.length < 1) {
return '';
}
for(i = 0; i < strs.length; i++) {
for(j = 0; j < prefix.length; j++) {
if(strs[i][j] !== prefix[j]) {
prefix = strs[i].slice(0, j);
}
}
}
return prefix;
}
console.log(getPrefix(['start', 'stair', 'step']));
console.log();
console.log(getPrefix(['start', 'wework', 'today']));
console.log();
결과
st
모델 솔루션
function getPrefix(strs) {
if (strs.length === 0) return '';
let prefix = strs[0];
for (let i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) !== 0) {
prefix = prefix.substring(0, prefix.length - 1);
}
}
return prefix;
}
console.log(getPrefix(['start', 'stair', 'step']))
/* 또는
function getPrefix(strs) {
if (strs.length === 0) return '';
let strArr = strs[0].split('');
let idx = 0;
let stop = false;
for (let i = 0; i < strArr.length; i++) {
let char = strArr[i];
for (let j = 0; j < strs.length; j++) {
let thisStrArr = strs[j].split('');
if (char !== thisStrArr[i]) {
idx = i-1;
stop = true;
break;
}
}
if (stop) break;
}
if (!stop) {
idx = strArr.length - 1;
}
return strArr.slice(0, idx+1).join('');
}
*/
결과
st
모델솔루션 1번 방법이 이해가 제일 잘된다
아직 감이 잘 안잡히므로 코드를 그대로 풀어쓴다면
1. 인자로 전달받은 배열의 길이가 0과 같다면''
빈 값 return
2. 공통된 시작 단어를 찾아야되니 비교값인 prefix 변수에 배열의 첫번째 요소 할당
3. 첫번째 반복문(for loop) 시작
-> 인자로 전달받은 배열의 첫번째 요소를 비교값에 할당했으니 두번째 요소부터 시작
4. 값 비교를 위해 두번째 반복문(while loop) 시작
-> 하나하나 풀어 써보자
-> str[1]은 stair 이고 prefix는 start, stair.indexOf(start) 가 0과 같지 않다면,
즉 처음 시작에 포함되어 있지 않다면
5. prefix에 prefix는 0부터 4(prefix.length-1) substring (0~3 인덱스에 해당하는 요소 추출) 한다
-> prefix = star
-> while 반복 들어가서 stair.indexOf(star) 은 0이 아니니 조건 true로
-> prefix = sta (0부터 3(prefix.length-1) substring (0~2 인덱스에 해당하는 요소 추출)
-> while 반복 들어가서 stair.indexOf(sta) === 0 이므로 조건 false로 다음 반복으로 넘어감
6. str[2]은 step 이고 prefix는 sta
-> while 반복 들어가서 step.indexOf(sta) 는 0이 아니니 조건 True로
-> prefix = st (0부터 2(prefix.length-1) substring (0~1 인덱스에 해당하는 요소 추출)
-> while 반복 들어가서 stair.indexOf(st) === 0 이므로 조건 false로 모든 반복 종료