Level 0) 수학, 시뮬레이션, 문자열, 사칙연산

Doozuu·2023년 1월 21일
0

프로그래머스 (JS)

목록 보기
21/183

📌 문제 1. 직사각형 넓이 구하기

문제 설명

2차원 좌표 평면에 변이 축과 평행한 직사각형이 있습니다. 직사각형 네 꼭짓점의 좌표 [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]가 담겨있는 배열 dots가 매개변수로 주어질 때, 직사각형의 넓이를 return 하도록 solution 함수를 완성해보세요.

풀이

배열을 정렬하고, 구조분해할당을 통해 가장 작은 점과 가장 큰 점의 좌표값을 구한다.
좌표값을 이용해 직사각형의 넓이를 구하고 음수인 경우 양수로 바꾸어 준다.
(넓이가 음수가 되는 경우를 고려하는 것이 포인트!)

function solution(dots) {
    let newDots = dots.sort();
    let [x1,y1] = newDots[0];
    let [x2,y2] = newDots[3];
    let answer = (x2 - x1) * (y2 - y1);
    return answer > 0 ? answer : answer * (-1);
}



📌 문제 2. 캐릭터의 좌표 ⭐️

문제 설명

머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

[0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.

풀이

function solution(keyinput, board) {
    let answer = [0,0];
    let max_x = (board[0]-1)/2;
    let max_y = (board[1]-1)/2;
    for(i=0;i<keyinput.length;i++){
      if(keyinput[i] == "left"){
       	  if(Math.abs(answer[0]) >= max_x) continue;
          else answer[0] -= 1;    
      }else if(keyinput[i] == "right"){
     	  if(Math.abs(answer[0]) >= max_x) continue;
          else answer[0] += 1;        
      }else if(keyinput[i] == "down"){
     	  if(Math.abs(answer[1]) >= max_y) continue;
          else answer[1] -= 1;
      }else if(keyinput[i] == "up"){
      	  if(Math.abs(answer[1]) >= max_y) continue;
          else answer[1] += 1;
      }   
    }
    return answer;
}

case 8번에서 자꾸 틀림
ex) ["down", "up"], [3,3]
-> [0,0]이 나와야 하는데 [0,-1]이 나옴.
이유 : down을 해서 [0,-1]인 상태로 up의 조건문을 보면 answer[1]이 max_y와 같으므로 1을 더하지 않고 끝나버림.

그렇다고 클 때만 끝내는 조건으로 바꿔버리면
ex) ["down", "down", "down", "down", "down"], [7, 9]
-> [0, -4]가 나와야 하는데 [0, -5]가 나옴.
이유 : max_y와 같을 때 멈춰야 하는데 같을 때 멈추는 조건을 뺐으므로 1이 더 빠짐.

수정 방안

조건문을 선행하면 두 가지 케이스가 충돌하므로, 연산식을 선행한 후에 조건문으로 체크해준다.
(일단 더하거나 뺀 다음에 조건문으로 체크해서 넘은 길이를 조절하자.)
-> 해결!!!

function solution(keyinput, board) {
    let answer = [0,0];
    let max_x = (board[0]-1)/2;
    let max_y = (board[1]-1)/2;
    for(i=0;i<keyinput.length;i++){
      if(keyinput[i] == "left"){
          answer[0] -= 1;
          if(Math.abs(answer[0]) > max_x) answer[0] += 1;
      }else if(keyinput[i] == "right"){
          answer[0] += 1;
          if(Math.abs(answer[0]) > max_x) answer[0] -= 1;
      }else if(keyinput[i] == "down"){
          answer[1] -= 1;
          if(Math.abs(answer[1]) > max_y) answer[1] += 1;
      }else if(keyinput[i] == "up"){
          answer[1] += 1;
          if(Math.abs(answer[1]) > max_y) answer[1] -= 1;
      }   
    }
    return answer;
}



📌 문제 3. 최댓값 만들기 (2)

정렬을 한 뒤, 가장 작은 두 값의 곱과 가장 큰 두 값의 곱 중 어떤 것이 큰 지 비교함.
-> 비교하는 과정에서 삼항연산자 혹은 조건문을 사용하면 식이 좀 길어짐.

function solution(numbers) {
    numbers.sort((a,b) => b - a);
    let index = numbers.length - 1;
    
    if(numbers[0] * numbers[1] >= numbers[index] * numbers[index - 1]){
        return numbers[0] * numbers[1]; 
    }else{
        return numbers[index] * numbers[index - 1];
    }
}

Math.max( )를 이용해 비교문을 단축시킬 수 있다.

function solution(numbers) {
    numbers.sort((a, b) => a - b);
    return Math.max(numbers[0]*numbers[1], numbers[numbers.length-1]*numbers[numbers.length-2]);
}

⭐️ Math.max(a, b)

: a와 b 중 큰 것을 반환함.



📌 문제 4. 다항식 더하기 ⭐️

문제 설명

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

풀이

구조분해할당을 이용해 x항과 상수항을 계산한 값을 배열에 담는다.
[x, c]
새로운 값이 x를 포함하면 x 계수의 합을 계산해 x에 담아준다.
(이때, x의 계수가 1인 경우를 따로 고려해 주어야한다.)
x를 포함하지 않는 경우(상수항)에는 상수항의 합을 구해 c에 담아준다.

계산이 끝나면 4가지 경우를 고려해 답을 구해준다.

  • x항이 없는 경우
  1. x항과 상수항이 모두 0인 경우 : '0' return
  2. x항이 없는 경우 : 숫자를 문자열로 바꾸어 return
  • x항이 있는 경우
    ** x계수가 1일 때와 아닐 때를 고려해 x를 붙여준다.
  1. 상수항이 없는 경우 : 새로 갱신한 x를 return
  2. x항과 상수항이 모두 있는 경우 : x와 상수항 사이에 + 기호를 붙여 return
function solution(polynomial) {
    let [x, c] = polynomial.split('+').reduce(([a,b],s) => {
        if(s.includes('x')){
            return [a + Number(s.trim().replace('x','') || 1), b];
        }
        return [a, b + Number(s)];
    }, [0,0]);

    if(!x && !c) return '0';
    if(!x) return c.toString();
    x = `${x==1?'':x}x`;
    if(!c) return x;
    return `${x} + ${c}`;
}

⭐️ trim()

: 앞뒤 공백 제거

⭐️ reduce((acc,cur) => ~~)

: acc,cur에 배열을 담아서 활용할 수도 있다.

profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글