그저 내가 되었고
항해99) 2주차:: Algorithm Test(JS) 본문
1번. 없는 정수 사이의 합 (하)
0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 숫자는 두개입니다. 두 정수를 a,b라고 했을 때, a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
입출력 예
checkin | result |
[1,2,4,6,7,8,9,0] | 12 |
7,8,3,5,6,1,2,4 | 45 |
지정 입력값
checkin | result |
[1,3,5,9,2,4,8,0] | 13 |
답안 포맷
function solution(arr1){
let answer=0;
return answer;
}
let arr1=[1,3,5,9,2,4,8,0];
console.log(solution(arr1))
How I Solved
function solution(arr1) {
let allNums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let diff = allNums.filter(x => !arr1.includes(x));
let a = diff[0];
let b = diff[1];
return (a + b) * (Math.abs(b - a) + 1) / 2;
}
let arr1 = [1,3,5,9,2,4,8,0];
console.log(solution(arr1))
2번. 이상한 문자 만들기2 (중)
문제 설명
제한 조건
- 공백을 포함하지 않고, 문자열 전체의 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
s | result |
"try hello world"
|
"TrY hElLo WoRlD"
|
“yoon ji yong”
|
“YoOn Ji YoNg”
|
지정 입력값
s | result |
“hang hae ninety nine”
|
"HaNg HaE nInEtY nInE"
|
답안 포맷
function solution(s){
let answer="";
return answer;
}
let s= “hang hae ninety nine”;
console.log(solution(s))
How I Solved
못풀었다.
..
.....
..................ㅎr
거짓말 아니고...... 3시간동안, 아니다 비디오 찍고 업로드하고 하느라 넉넉히 30분 썼다고 치면
2시간 반을 이 한문제를 붙잡고 있었는데ㅋㅋㅋㅋㅋㅋㅋ 결국 못풂.............
문자열에서, 공백을 제외하고, 문자 자체에서만 인덱스를 메기는건데,
시험 치는 동안에는 그걸 어떻게 구현해야하는지 도무지 감이 잡히지 않았었다.....
계속
'아니..... 공백을 그냥 다 붙여버리면 나중에 뗄 수 없잖아. 그건 안되는데?!!??'
'공백... 을 만나면.... continue를 해야하나? i를 i+1로 바꾸고? 아니 그러면 하나씩 빌텐데?'
등등등
막 오만 잡다한 생각들... 주로 대체 어떻게하면 공백을 제외하는 척 하면서 문자열에만 인덱스를 메기는건지 그게 도무지 이해가 안갔다.
근..데......T T 똑또기한테 어떻게 풀었냐고 물어보고 설명 듣다가 안되겠어서 그냥 코드 냅다 받아서 뜯어봤는데
function solution(s) {
//s = s.toLowerCase()
s = s.split(" ")
z = s.map((x, i) => s[i].split(''))
let count = 0;
for (let i = 0; i < z.length; i++) {
for (let j = 0; j < z[i].length; j++) {
if (count % 2 === 1) {
z[i][j] = z[i][j].toLowerCase()
} else if (count % 2 === 0) {
z[i][j] = z[i][j].toUpperCase()
}
count++
}
z[i].push(' ')
}
z = z.join('').replace(/,/g, '').slice(0, -1)
return z
}
let s = "hang hae ninety nine"
console.log(solution(s))
일단 map을 썼다((전날 밤 거의 11시?에 map 잘 몰라서 걔한테 물어봤는데 걔도 잘 모른다길래 이거 중요하다고 직.접.읊어줌..... 그리고 정작 나는 map을 못썼지..................ㅋㅋ 누가 누굴 가르치니,,,,,,,,ㅋㅋ.............................................................))
anyway 그냥 문자열 내부의 단어들을 공백 기준으로 split 후 map 돌리면
[
[ 'h', 'a', 'n', 'g' ],
[ 'h', 'a', 'e' ],
[ 'n', 'i', 'n', 'e', 't', 'y' ],
[ 'n', 'i', 'n', 'e' ]
]
이렇게 나오는데........
여기서 우리의 똑또기는.... count를 0으로 선언하심. 이게 도대체 갑자기 어디서 튀어나온 비러먹을 카운트여....... 했는데............. 저 count가 위의 큰 배열 내부의 각각의 작은 배열, 그리고 또 그 안에서의 하나하나의 문자들의 인덱스를 잡는 역할이었다..................
아니.......... 천잰가.........................? 나 지짜 감동받엇는데.....................
어떻게 그런 생각을 하지?ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ 엉?!??!!?!ㅎㅎㅎㅎㅎㅎ....................
그리고 그 count에 따라서ㅠ 대소문자로 각각 바꿔줬다.................
3번. 같은 단어는 싫어 (상)
배열 arr와 정수 n이 주어집니다. 배열 arr의 각 원소는 문자열로 이루어져 있습니다. 이때, 배열 arr에서 중복되는 단어는 전부 제거하려고 합니다. 단, 제거된 후 남은 단어들을 반환할 때는 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
제한 조건
- strings는 길이 1 이상, 50이하인 배열입니다.
입출력 예
arr | n | result |
["brush", "sun", "brush", "bed", "car"] | 1 |
["car", "bed", "sun"]
|
["banana", "cat", "car", "apple", "banana", "banana"] | 0 |
["apple","car","cat"]
|
지정 입력값
arr | n | result |
["coke", "water", "glass", "dog", "dog", "yogurt", "vitamin"] | 2 |
["glass", "yogurt", "coke", "vitamin", "water"]
|
답안 포맷
function solution(arr, n){
let answer=[];
return answer;
}
let arr=["coke", "water", "glass", "dog", "dog", "yogurt", "vitamin"];
let n=2;
console.log(solution(arr, n))
How I Solved
function solution(arr, n) {
let searchDuplicates = arr => ( arr.filter((x, index) => arr.indexOf(x) !== index) )
let duplicates = searchDuplicates(arr);
let b4Sort = [];
for (i = 0; i < arr.length; i++) {
b4Sort = arr.filter(x => !duplicates.includes(x));
}
return b4Sort.sort((a, b) => {
if (a[n] > b[n]) return 1;
else if (a[n] < b[n]) return -1;
else return a > b ? 1 : -1;
});
}
let arr = ["coke", "water", "glass", "dog", "dog", "yogurt", "vitamin"];
let n = 2;
console.log(solution(arr, n))
➾이 문제는 배열 안에 중복되는 값이 있을 시, 일반적으로 하나는 남기는 여타 문제들과 달리 모든 중복된 값을 제거한다는 점에서 특이했다. 중복된 값을 찾아서 그 값들을 주어진 배열에서 모두 제거하는 방법으로 아이디어를 구현함.
➾첫번째로 searchDuplicates라는 변수를 잡는다. 이 변수는 입력된 배열에서 filter을 이용해 중복을 찾아주는 콜백함수를 호출한다. arr의 x값 즉 각각 요소들과 index값을 이용하며, 어레이의 첫 번째 값의 인덱스와 다른 값들의 인덱스를 비교한다. indexOf를 이용해(indexOf() 메서드는 걔를 호출한 string 객체에서 주어진 값과 일치하는 첫 번째 인덱스를 반환) 특정 중복된 항목이 있을 경우 첫 번째로 걔를 만났을 때가 아닌 그 다음에 걔를 만났을 때는 indexOf와 index가 일치하지 않을 것임로 중복된 항목으로 판단할 수 있다.
➾그렇게 searchDuplicates를 거친 arr의 중복값을 duplicates라는 새로운 변수에 담는다.
➾이후 b4sort라는 배열을 하나 만든다.
for문을 돌면서 차집합을 구하듯, filter을 다시 이용해 arr의 x값들 중 duplicates에 들어있는 값들을 전부 filtering해서 b4sort에 재할당한다.
➾마지막으로 정렬의 과정이 필요하다. 인덱스 n번째 글자를 기준으로 오름차순 정렬하기 위해, b4Sort 내의 n번째 글자를 뽑아서 sort한다.. 두 글자씩 뽑아서, 이전 엘리먼트a[n]보다 이후 엘리먼트b[n]가 크면 순서를 바꾸기 때문에 결국 오름차순으로 정렬되는 로직. 또한 n번째 글자 값이 같을 경우 사전 순서대로 정렬해야하므로, a와 b 단어 자체를 비교해서 a보다 b가 작을 경우 순서를 바꿔서 결국 최종적으로 작은 값이 앞으로 오도록, 오름차순 된다.
'개발 > 항해99 9기' 카테고리의 다른 글
항해99) 3주차:: 주특기 입문; 📚Express.js (0) | 2022.10.03 |
---|---|
항해99) 2주차:: 💡2주차 맺음 WIL; 알고리즘 관련 중요 정리 + 소회✍🏻 (0) | 2022.10.02 |
항해99) 2주차:: Algorithm Mock Test(JS) (0) | 2022.09.27 |
항해99) 2주차:: TIL(화살표 함수 & 구조 분해 할당 & break문 & continue문 & for...of문 & for...if문) (0) | 2022.09.26 |
항해99) 2주차:: 알고리즘 테스트 연습(15~28); How I solved + more (0) | 2022.09.26 |