11일차 알고리즘

태권·2022년 8월 11일
0

알고리즘

목록 보기
6/8
post-custom-banner

1번. 행렬 음양 더하기

행렬이 두개 있습니다. 두 행렬의 절댓값을 차례대로 담은 정수 배열 arr1, arr2와 행렬의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 두 행렬의 부호는 같습니다.
실제 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
제한 조건
행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.
for문을 써서 푼 경우이다.

function solution(arr1, arr2,signs) {
   
//     let answer = [];

//     for (let i = 0; i < arr1.length; i++) {
//         answer[i] = [];
//         for (let j = 0; j < arr1[i].length; j++) {
//             signs[i][j] ==true ?  answer[i].push(arr1[i][j]+arr2[i][j]) :  answer[i].push(-(arr1[i][j]+arr2[i][j]))
//         }
//     }

//     return answer;
// }
// let arr1 = [[5,7,1],[2,3,5]]
// let arr2 = [[5,1,6],[7,5,6]]
// let signs = [[true,true,false],[false,true,false]]
// console.log(solution(arr1,arr2,signs))

map을 써서 푼경우이다.

function solution2(arr1, arr2,signs) {
//     return arr1.map((x,i)=> x.map((y,j)=> signs[i][j]==true ? y + arr2[i][j] : -(y+arr2[i][j])))
// }

2번. 자연수 뒤집어 더하기

자연수 n의 각 자리 숫자를 뒤집은 순서로 더해 출력하는 수식을 리턴해주세요. 예를들어 n이 12345이면 "5+4+3+2+1=15" 라는 문자열을 리턴합니다.
제한 조건
N의 범위 : 100,000,000 이하의 자연수

function solution(n){
	let arr = String(n).split('').map(x => +x).reverse()
    let sum = arr.reduce((f,g)=>f+g)
    let fword = ""
    for(let i=0; i<arr.length; i++){
        fword += arr[i] + "+" 
    }
    let cut = fword.slice(0,fword.length-1) 
    let result= `"${cut}=${sum}"`
	return result;
}
console.log(solution(718253))

여기서 join('+')썼다가 오류가나서 다시 안썼는데 join을 써서 풀수 있는 방법이 있다.
다른팀원 풀이

function solution(n){
	let reverseNum = String(n).split('').map(Number).reverse()
  // [3,5,2,8,1,7]
  let sum = reverseNum.reduce((prev,curr)=> prev + curr)
  // 26
  return `"${reverseNum.join("+")}=${sum}"`
}
function solution(n) {
    let nums = n.toString().split('').reverse().join('+'); // 3+5+2+8+1+7
    let sum = n.toString().split('').reverse().map(Number).reduce((sum, item) => sum+item); // 26

    let result = `${nums}=${sum}`;

    return result;
}

3번. 같은 단어는 싫어

배열 arr와 정수 n이 주어집니다. 배열 arr의 각 원소는 문자열로 이루어져 있습니다. 이때, 배열 arr에서 중복되는 단어는 전부 제거하려고 합니다. 단, 제거된 후 남은 단어들을 반환할 때는 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다.
예를 들어 strings가 ["brush", "sun", "brush", "bed", "car"]이고 n이 1이면 중복을 제거한 배열인 ["sun", "bed", "car"]에서 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
제한 조건
strings는 길이 1 이상, 50이하인 배열입니다.
strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
모든 strings의 원소의 길이는 n보다 큽니다.
인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

function solution(arr, n){
    let remove = []
    let arr1 = arr.sort()
    for(let i=0; i<arr1.length; i++){
        if(arr1[i] !== arr1[i+1] && arr1[i] != arr1[i-1]){
            remove.push(arr1[i])
        }
    }
    let arr2 = remove.sort()
    let word = []
    arr2.forEach(x=> word.push(x[n-1]))
    console.log(arr2)
    console.log(word)
    let sword = word.sort()
    let result=[];
    for(let j=0; j<arr2.length; j++){
            for(let k=0; k<sword.length; k++){
                sword[j] == arr2[k][n-1] ? result.push(arr2[k]) : false
            }
        }
    let answer = [...new Set(result)]
	return answer;
}
let arr=["coke", "water", "glass", "dog", "dog", "yogurt", "vitamin"];
let n=2;
console.log(solution(arr, n))

처음에 중복되는 단어 없애라길래 set을 써서 없앴더니 중복되는 단어를 아예 둘다 없애는 것이였다.
그래서 문자가 다른 위치에 있을 수 있어서 정렬을 하여 중복되는 단어를 근처에 붙게 만들었다
그후에 해당 문자의 앞과 뒤의 문자과 하나라도 겹치면 그것을 제외하여 새로운 배열을 만들었다.
그후 해당 배열의 n번째에 해당하는 문자를 word에 담고 그단어를 오름차순으로 바꾸고
그 sword의 첫번째 글자를 가지는 단어를 맨처음 넣으면 되니 for을 위처럼 만들어 result 배열을 새로 만들었고 그후 같은 sword를 가지는 단어가 들어갈 수있으니 중복되는 단어를 set으로 사라지게 해준다.

profile
2022.08 개발자 시작
post-custom-banner

0개의 댓글