티스토리 뷰

1️⃣ 직사각형 넓이 구하기

 

문제 설명

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

 

제한사항

  • dots의 길이 = 4
  • dots의 원소의 길이 = 2
  • -256 < dots[i]의 원소 < 256
  • 잘못된 입력은 주어지지 않습니다.

입출력 예

dots result
[[1, 1], [2, 1], [2, 2], [1, 2]] 4
[[-1, -1], [1, 1], [1, -1], [-1, 1]] 0

 

입출력 예 #1

  • 좌표 [[1, 1], [2, 1], [2, 2], [1, 2]] 를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 1, 1이므로 직사각형의 넓이는 1 x 1 = 1입니다.

입출력 예 #2

  • 좌표 [[-1, -1], [1, 1], [1, -1], [-1, 1]]를 꼭짓점으로 갖는 직사각형의 가로, 세로 길이는 각각 2, 2이므로 직사각형의 넓이는 2 x 2 = 4입니다.

 

💻 나의 풀이

class Solution {
    public int solution(int[][] dots) {
        int w = 0;   // 너비
        int h = 0;   // 높이
        
        int x = dots[0][0];   // dots의 첫번째 행
        int y = dots[0][1];   // dots의 두번째 행
        
        for(int i=1; i<dots.length; i++){
            if(x != dots[i][0]) w = Math.abs(x - dots[i][0]);
            if(y != dots[i][1]) h = Math.abs(y - dots[i][1]);
        }
        
        return w*h;
    }
}

 

직사각형의 넓이는 너비 x 높이 이니까 먼저 너비와 높이 변수를 생성해 초기화 시켜줍니다.

2차원 배열인 dots의 첫 번째 행의 점의 좌표를 담을 x와 두 번째 행의 점의 좌표를 담을 y도 만들어줍니다.

그 후 for문을 통해 나머지 점들을 확인하면서 첫번째 점의 x좌표, y좌표가 다르다면 각각 빼서 w와 h를 구할 수 있습니다.

여기서 Math.abs() 메소드를 통해 절대값으로 반환해줍니다. 

 


 

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]까지 이동할 수 있습니다.

 

제한사항

  • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
  • board의 가로 크기와 세로 크기는 홀수입니다.
  • board의 크기를 벗어난 방향키 입력은 무시합니다.
  • 0 ≤ keyinput의 길이 ≤ 50
  • 1 ≤ board[0] ≤ 99
  • 1 ≤ board[1] ≤ 99
  • keyinput은 항상 up, down, left, right만 주어집니다.

입출력 예

keyinput board result
["left", "right", "up", "right", "right"] [11, 11] [2, 1]
["down", "down", "down", "down", "down"] [7, 9] [0, -4]

 

입출력 예 설명 #1

  • [0, 0]에서 왼쪽으로 한 칸 오른쪽으로 한 칸 위로 한 칸 오른쪽으로 두 칸 이동한 좌표는 [2, 1]입니다.

입출력 예 설명 #2

  • [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.

 

🔎 다른 사람의 풀이

class Solution {
    public int[] solution(String[] keyinput, int[] board) {
        int x = 0;
        int y = 0;
        int boardX = board[0] / 2;
        int boardY = board[1] / 2;
        
        for (int i = 0; i < keyinput.length; i++) {
            if (keyinput[i].equals("up")) {
                if (y < boardY) {
                    y += 1;
                }
            } else if (keyinput[i].equals("down")) {
                if (y > -boardY) {
                    y -= 1;
                }
            } else if (keyinput[i].equals("left")) {
                if (x > -boardX) {
                    x -= 1;
                }
            } else if (keyinput[i].equals("right")) {
                if (x < boardX) {
                    x += 1;
                }
            }
        }
        int[] answer = {x, y};
        return answer;
    }
}

 

  1. 초기에 현재 위치인 x와 y는 각각 0으로 초기화됩니다.
  2. 보드의 중앙 위치(boardX, boardY)를 계산합니다.
  3. 주어진 키 입력(keyinput) 배열을 반복하면서 각 키에 따라 x와 y를 이동시킵니다.
  4. "up" 입력일 때는 y가 boardY보다 작을 때까지 y를 1 증가시킵니다.
  5. "down" 입력일 때는 y가 -boardY보다 클 때까지 y를 1 감소시킵니다.
  6. "left" 입력일 때는 x가 -boardX보다 클 때까지 x를 1 감소시킵니다.
  7. "right" 입력일 때는 x가 boardX보다 작을 때까지 x를 1 증가시킵니다.
  8. 최종적으로 이동한 위치의 x와 y를 배열로 만들어 반환합니다.

 


 

3️⃣ 최댓값 만들기 (2)

 

문제 설명

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소 중 두 개를 곱해 만들 수 있는 최댓값을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • -10,000 ≤ numbers의 원소 ≤ 10,000
  • 2 ≤ numbers 의 길이 ≤ 100

입출력 예

numbers result
[1, 2, -3, 4, -5] 15
[0, -31, 24, 10, 1, 9] 240
[10, 20, 30, 5, 5, 20, 5]
600

 

입출력 예 #1

  • 두 수의 곱중 최댓값은 -3 * -5 = 15 입니다.

입출력 예 #2

  • 두 수의 곱중 최댓값은 10 * 24 = 240 입니다.

입출력 예 #3

  • 두 수의 곱중 최댓값은 20 * 30 = 600 입니다.

 

💻 나의 풀이

import java.util.Arrays;

class Solution {
    public int solution(int[] numbers) {
        Arrays.sort(numbers);
        
        int a = numbers[0] * numbers[1];
        int b = numbers[numbers.length-1] * numbers[numbers.length-2];
        
        if(a>b){
            return a;
        } else {
            return b;
        }
    }
}

 

 

문제에서 주의할 점은 양수끼리 곱해지느냐, 음수끼리 곱해지느냐 였습니다.

먼저 정렬을 해주고 정렬된 배열에서 가장 왼쪽 끝에 두 개를 곱했을 떄와 (음수*음수) 가장 오른쪽 끝 두 개를 곱했을 때 (양수*양수) 의 값을 비교해서 더 큰 값을 반환하도록 했습니다.

 

 

🔎 다른 사람의 풀이

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        int len = numbers.length;
        Arrays.sort(numbers);
        return Math.max(numbers[0] * numbers[1], numbers[len - 2] * numbers[len - 1]);
    }
}

 

 


 

4️⃣ 다항식 더하기

 

문제 설명

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

 

제한사항

  • 0 < polynomial에 있는 수 < 100
  • polynomial에 변수는 'x'만 존재합니다.
  • polynomial은 양의 정수, 공백, ‘x’, ‘+'로 이루어져 있습니다.
  • 항과 연산기호 사이에는 항상 공백이 존재합니다.
  • 공백은 연속되지 않으며 시작이나 끝에는 공백이 없습니다.
  • 하나의 항에서 변수가 숫자 앞에 오는 경우는 없습니다.
  • " + 3xx + + x7 + "와 같은 잘못된 입력은 주어지지 않습니다.
  • 0으로 시작하는 수는 없습니다.
  • 문자와 숫자 사이의 곱하기는 생략합니다.
  • polynomial에는 일차 항과 상수항만 존재합니다.
  • 계수 1은 생략합니다.
  • 결괏값에 상수항은 마지막에 둡니다.
  • 0 < polynomial의 길이 < 50

입출력 예

polynomial result
"3x + 7 + x" "4x + 7"
"x + x + x" "3x"

 

입출력 예 #1

  • "3x + 7 + x"에서 동류항끼리 더하면 "4x + 7"입니다.

입출력 예 #2

  • "x + x + x"에서 동류항끼리 더하면 "3x"입니다.

💻 나의 풀이

 

이 문제는 못풀어서 다른 사람들의 풀이를 보며 공부했습니다. 😥

 

 

🔎 다른 사람의 풀이

class Solution {
    public String solution(String polynomial) {
        int xNum = 0; int num = 0;

        for (String s : polynomial.split(" ")) {
            if (s.contains("x")) // x가 있으면
                xNum += s.equals("x") ? 1 : Integer.parseInt(s.replaceAll("x", ""));
            else if (!s.equals("+"))
                num += Integer.parseInt(s);
        }
        
        return (xNum != 0 ? xNum > 1 ? xNum + "x" : "x" : "") 
        		+ (num != 0 ? (xNum != 0 ? " + " : "") 
                + num : xNum == 0 ? "0" : "");
    }
}

 

polynomial 문자열을 공백(" ")을 기준으로 분리하여 배열로 만듭니다.

배열을 순회하면서 각 항목이 x를 포함하는지, +가 아닌 다른 숫자인지에 따라 xNum 변수와 num 변수를 업데이트 합니다.

이때 xNum은 'x'의 계수, num은 상수 항의 계수를 나타냅니다.

최종적으로 다항식을 간소화한 문자열을 생성하여 반환해줍니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함