FE JS 알고리즘 문제 풀이(7주차)

김윤경·2023년 5월 22일
0

JS 알고리즘 문제

목록 보기
6/10
post-thumbnail

💻 7주차 문제

등수 매기기

⭐⭐⭐⭐⭐


💡 영어 점수와 수학 점수의 평균 점수를 기준으로 학생들의 등수를 매기려고 합니다. 영어 점수와 수학 점수를 담은 2차원 정수 배열 score가 주어질 때, 영어 점수와 수학 점수의 평균을 기준으로 매긴 등수를 담은 배열을 return하도록 solution 함수를 완성해주세요.


문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120882

function solution(score) {
  const answer = [];
  const avg = score.map(score => (score[0]+score[1])/2);
  const rankAvg = [...avg].sort((a, b) => b-a)
  for (let i of rankAvg) {
    answer.push(rankAvg.indexOf(i)+1)
  }
  return answer;
}

알듯말듯 . . . 헷갈리는 문제였다. 특히 for문 !!!

저주의 숫자 3

⭐⭐⭐


💡 3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.

정수 n이 매개변수로 주어질 때, n을 3x 마을에서 사용하는 숫자로 바꿔 return하도록 solution 함수를 완성해주세요.


문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120871

function solution(n) {
  let answer = 0;
  for (let i = 0; i < n; i++) {
    answer++
    while (answer.toString().includes("3") || answer % 3 === 0) {
      answer++
    }
  }
  return answer;
}

다항식 더하기

⭐⭐⭐⭐⭐⭐


💡 한 개 이상의 항의 합으로 이루어진 식을 다항식이라고 합니다. 다항식을 계산할 때는 동류항끼리 계산해 정리합니다. 덧셈으로 이루어진 다항식 polynomial이 매개변수로 주어질 때, 동류항끼리 더한 결과값을 문자열로 return하도록 solution 함수를 완성해보세요. 같은 식이라면 가장 짧은 수식을 return합니다.


문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120863

function solution(polynomial) {
    const polynomialArr = polynomial.split(" + ");
    
    let x = 0;
    let num = 0;
    
    polynomialArr.forEach(item => {
        if(item.includes("x")){
            const xArr = item.split("x");
            const answer = xArr[0] === "" ? x += 1 : x += Number(xArr[0]) ;
        }
        else {
            num += Number(item);
        }
    })
    
    if(x !== 0 && num !== 0){
        return x === 1 ? `x + ${num}` : `${x}x + ${num}`;    
    }
    else if(x !== 0 && num === 0){
        return x === 1 ? "x" : `${x}x`;
    }
    else if(x === 0 && num !== 0){
        return `${num}`;
    }
    else {
        return "0";
    }
}

이 문제는 머릿속으로만 생각하면 쉬운데 코드로 작성하려니까 점점 길어져서 어려웠다. 좀 더 짧게 적을 수 있는 방법이 없을까 ?

안전지대

⭐⭐⭐⭐⭐⭐⭐⭐⭐


💡 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우, 대각선 칸을 모두 위험지역으로 분류합니다.

지뢰는 2차원 배열 board에 1로 표시되어 있고, board에는 지뢰가 매설된 지역 1과 지뢰가 없는 지역 0에만 존재합니다. 지뢰가 매설된 지역의 지도 board가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.


문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120866

function solution(board) {
  let result = 0
  
  for(let i = 0 ; i < board.length ; i ++) {
    for(let j = 0 ; j < board[i].length ; j ++) {
      if(board[i][j] === 1) {
        if(i !== 0 && board[i-1][j] !== 1) {
          board[i-1][j] = 2    
        }
        if(i !== board.length-1 && board[i+1][j] !== 1) {
          board[i+1][j] = 2
        }
        if(j !== 0 && board[i][j-1] !== 1) {
          board[i][j-1] = 2
        }
        if(j !== board[i].length-1 && board[i][j+1] !== 1) {
          board[i][j+1] = 2
        }
        if(i !== 0 && j !== 0 && board[i-1][j-1] !== 1) {
          board[i-1][j-1] = 2
        }
        if(i !== 0 && j !== board[i].length-1 && board[i-1][j+1] !== 1) {
          board[i-1][j+1] = 2
        }
        if(i !== board.length-1 && j !== 0 && board[i+1][j-1] !== 1) {
          board[i+1][j-1] = 2
        }
        if(i !== board.length-1 && j !== board[i].length-1 && board[i+1][j+1] !== 1) {
          board[i+1][j+1] = 2
        }
      }
    }
  }
  board.forEach(a => a.forEach(b => b === 0 ? result++ : null))
  return result
}

구글링해서 어찌저찌 풀긴했는데 이번 주차 문제 중에서 제일 어려웠던 것 같다. 이 문제도 짧게 풀 수 있지 않을까 ? ㅜㅜ

겹치는 선분의 길이

⭐⭐⭐⭐⭐⭐


💡 선분 3개가 평행하게 놓여 있습니다. 세 선분의 시작과 끝 좌표가 [[start, end], [start, end], [start, end]] 형태로 들어있는 2차원 배열 lines가 매개변수로 주어질 때, 두 개 이상의 선분이 겹치는 부분의 길이를 return하도록 solution 함수를 완성해보세요.
lines가 [[0, 2], [-3, -1], [-2, 1]] 일 때, 그림으로 나타내면 다음과 같습니다.

선분이 두 개 이상 겹친 곳은 [-2, -1], [0, 1] 로 길이 2만큼 겹쳐있습니다.


문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120876

function solution(lines) {
  let answer = 0;
  let lineArr = new Array(200).fill(0);
  
  for (let i = 0; i < lines.length; i++) {
    let start = lines[i][0];
    let end = lines[i][1];
    
    // 음수값을 없애주는 코드
    for (let j = start; j < end; j++){
      lineArr[j+100] += 1;
    }
  }
  
  for (let i in lineArr) {
    if (lineArr[i] > 1) {
      answer += 1;
    }
  }
  return answer;
}

악 생각보다 너무 어렵다 ㅜㅜ 그래도 다 풀고 나니까 뿌듯하다 !!!

0개의 댓글