그저 내가 되었고

항해99) 2주차:: Algorithm Test(JS) 본문

개발/항해99 9기

항해99) 2주차:: Algorithm Test(JS)

hyuunii 2022. 9. 30. 00:15

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 (중)

문제 설명

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
 

제한 조건

- 공백을 포함하지 않고, 문자열 전체의 짝/홀수 인덱스를 판단해야합니다.

- 첫 번째 글자는 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이하인 배열입니다.

- strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
- strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
- 모든 strings의 원소의 길이는 n보다 큽니다.
- 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
 
 

입출력 예

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가 작을 경우 순서를 바꿔서 결국 최종적으로 작은 값이 앞으로 오도록, 오름차순 된다.