728x90
반응형
SMALL

문제 설명

문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요. "l"이나 "r"이 없다면 빈 리스트를 return합니다.


제한사항

  • 1 ≤ str_list의 길이 ≤ 20
  • str_list는 "u", "d", "l", "r" 네 개의 문자열로 이루어져 있습니다.

입출력 예

str_list result

["u", "u", "l", "r"] ["u", "u"]
["l"] []

입출력 예 설명

입출력 예 #1

  • "r"보다 "l"이 먼저 나왔기 때문에 "l"의 왼쪽에 있는 문자열들을 담은 리스트인 ["u", "u"]를 return합니다.

입출력 예 #2

  • "l"의 왼쪽에 문자열이 없기 때문에 빈 리스트를 return합니다.
package Lv0;

import java.util.ArrayList;
import java.util.Arrays;

/*
문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다.
 str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를,
먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
"l"이나 "r"이 없다면 빈 리스트를 return합니다.
 */
public class H181890 {
	public String[] solution(String[] str_list) {
		ArrayList<String> resultList = new ArrayList<>();
		int index = 0;

		for (; index < str_list.length; index++) {
			if (str_list[index].equals("l") || str_list[index].equals("r")) {
				break;
			}
		}

		if (index < str_list.length) {
			if (str_list[index].equals("l")) {
				resultList.addAll(Arrays.asList(str_list).subList(0, index));
			} else {
				resultList.addAll(Arrays.asList(str_list).subList(index + 1, str_list.length));
			}
		}

		String[] answer = new String[resultList.size()];
		return resultList.toArray(answer);
	}
}
728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.0' 카테고리의 다른 글

전국 대회 선발 고사  (0) 2023.05.07
종이 자르기  (0) 2023.05.07
주사위 게임 3  (0) 2023.05.07
평행  (0) 2023.05.06
배열 만들기 4  (0) 2023.05.06
728x90
반응형
SMALL

문제 설명

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q) 점을 얻습니다.
  • 2
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.


제한사항

  • a, b, c, d는 1 이상 6 이하의 정수입니다.

입출력 예

a b c d result

2 2 2 2 2222
4 1 4 4 1681
6 3 3 6 27
2 5 2 6 30
6 4 2 5 2

입출력 예 설명

입출력 예 #1

  • 예제 1번에서 네 주사위 숫자가 모두 2로 같으므로 1111 × 2 = 2222점을 얻습니다. 따라서 2222를 return 합니다.

입출력 예 #2

  • 예제 2번에서 세 주사위에서 나온 숫자가 4로 같고 나머지 다른 주사위에서 나온 숫자가 1이므로 (10 × 4 + 1) = 41 = 1681점을 얻습니다. 따라서 1681을 return 합니다.2
  • 2

입출력 예 #3

  • 예제 3번에서 a, d는 6으로, b, c는 3으로 각각 같으므로 (6 + 3) × |6 - 3| = 9 × 3 = 27점을 얻습니다. 따라서 27을 return 합니다.

입출력 예 #4

  • 예제 4번에서 두 주사위에서 2가 나오고 나머지 다른 두 주사위에서 각각 5, 6이 나왔으므로 5 × 6 = 30점을 얻습니다. 따라서 30을 return 합니다.

입출력 예 #5

  • 예제 5번에서 네 주사위 숫자가 모두 다르고 나온 숫자 중 가장 작은 숫자가 2이므로 2점을 얻습니다. 따라서 2를 return 합니다.
package Lv0;

import java.util.HashMap;
import java.util.Map;

/*
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

- 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
- 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q) 점을 얻습니다.

    2

- 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
- 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 `a`, `b`, `c`, `d`로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
 */
public class H181916 {
	public int solution(int a, int b, int c, int d) {
		int[] dice = {a, b, c, d};
		HashMap<Integer, Integer> counts = new HashMap<>();

		for (int number : dice) {
			counts.put(number, counts.getOrDefault(number, 0) + 1);
		}

		if (counts.size() == 1) {
			return 1111 * a;
		} else if (counts.size() == 2) {
			int[] numbers = new int[2];
			int[] countsList = new int[2];
			int index = 0;

			for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
				numbers[index] = entry.getKey();
				countsList[index] = entry.getValue();
				index++;
			}

			if (countsList[0] == 3 || countsList[1] == 3) {
				int p = numbers[0];
				int q = numbers[1];
				if (countsList[1] == 3) {
					p = numbers[1];
					q = numbers[0];
				}
				return (10 * p + q) * (10 * p + q);
			} else {
				int p = numbers[0];
				int q = numbers[1];
				return (p + q) * Math.abs(p - q);
			}
		} else if (counts.size() == 3) {
			int p = 0;
			for (Map.Entry<Integer, Integer> entry : counts.entrySet()) {
				if (entry.getValue() == 2) {
					p = entry.getKey();
				}
			}
			int q = 0;
			int r = 0;
			for (int number : counts.keySet()) {
				if (number != p) {
					if (q == 0) {
						q = number;
					} else {
						r = number;
					}
				}
			}
			return q * r;
		} else {
			return Math.min(Math.min(a, b), Math.min(c, d));
		}
	}

}
  1. 주사위 값들을 배열에 저장하고, 각 숫자별로 나온 횟수를 HashMap에 저장
  2. HashMap의 크기에 따라 점수를 계산하는 조건을 설정
    • HashMap의 크기가 1인 경우, 네 개의 주사위가 모두 같은 숫자이므로 1111 * a를 반환
    • HashMap의 크기가 2인 경우, 두 가지 경우로 나눠짐
      • 세 개의 주사위가 같은 숫자일 경우, (10 * p + q) * (10 * p + q)를 반환
      • 두 개의 주사위씩 같은 숫자일 경우, (p + q) * Math.abs(p - q)를 반환
    • HashMap의 크기가 3인 경우, 두 개의 주사위가 같은 숫자이고 나머지 두 개의 주사위가 서로 다른 숫자일 경우입니다. 이때 q * r을 반환
    • HashMap의 크기가 4인 경우, 네 개의 주사위가 모두 다른 숫자입니다. 가장 작은 숫자를 반환
728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.0' 카테고리의 다른 글

종이 자르기  (0) 2023.05.07
왼쪽 오른쪽  (0) 2023.05.07
평행  (0) 2023.05.06
배열 만들기 4  (0) 2023.05.06
배열 만들기 6  (0) 2023.05.06
728x90
반응형
SMALL

문제 설명

점 네 개의 좌표를 담은 이차원 배열  dots가 다음과 같이 매개변수로 주어집니다.

  • [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • dots의 길이 = 4
  • dots의 원소는 [x, y] 형태이며 x, y는 정수입니다.
    • 0 ≤ x, y ≤ 100
  • 서로 다른 두개 이상의 점이 겹치는 경우는 없습니다.
  • 두 직선이 겹치는 경우(일치하는 경우)에도 1을 return 해주세요.
  • 임의의 두 점을 이은 직선이 x축 또는 y축과 평행한 경우는 주어지지 않습니다.

입출력 예

dots result

[[1, 4], [9, 2], [3, 8], [11, 6]] 1
[[3, 5], [4, 1], [2, 4], [5, 10]] 0

입출력 예 설명

입출력 예 #1

  • 점 [1, 4], [3, 8]을 잇고 [9, 2], [11, 6]를 이으면 두 선분은 평행합니다.

입출력 예 #2

  • 점을 어떻게 연결해도 평행하지 않습니다.
class Solution {
    public int solution(int[][] dots) {
        int answer = 0;

        double slope1 = (double) (dots[1][1] - dots[0][1]) / (dots[1][0] - dots[0][0]);
        double slope2 = (double) (dots[3][1] - dots[2][1]) / (dots[3][0] - dots[2][0]);
        double slope3 = (double) (dots[2][1] - dots[0][1]) / (dots[2][0] - dots[0][0]);
        double slope4 = (double) (dots[3][1] - dots[1][1]) / (dots[3][0] - dots[1][0]);

        if (Math.abs(slope1 - slope2) < 1e-9 || Math.abs(slope1 - slope4) < 1e-9 || Math.abs(slope3 - slope2) < 1e-9) {
            answer = 1;
        }

        return answer;
    }
}

테스트 5, 12, 13, 16 실패..ㅠㅠ

계속해서 안되서 질문하기를 통해 답을 얻었습니다!

개인적인 의견은 문제 출제자분께서 조금 더 명확하게 문제를 설명하지 않았기 때문에 생긴 상황이라고 생각합니다.

4개의 점을 각각 a,b,c,d라고 했을 때, 12번 케이스부터 틀리신 분들은 아마 아래와 같은 6가지 경우의 수를 생각하셨을 겁니다.

  • a-b, a-c, a-d, b-c, b-d, c-d

그런데 문제에 적혀있는 '주어진 네 개의 점을 두 개씩 이었을 때'를 다시 잘 곱씹어보면서 혹시 아래와 같은 3가지 경우의 수 만을 의미하는게 아닌가 하고 코드를 처음부터 다시 짜보았고 통과했습니다.

  • [a-b, c-d],[a-c, b-d],[a-d, b-c]

즉, 4개의 점들로 임의의 두 쌍을 만들었을 때 그 두 쌍이 이루는 직선이 서로 평행한지를 묻는 문제였습니다.

정말.. 감사합니다!!

package Lv0;
/*
점 네 개의 좌표를 담은 이차원 배열  `dots`가 다음과 같이 매개변수로 주어집니다.

- [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]

주어진 네 개의 점을 두 개씩 이었을 때, 두 직선이 평행이 되는 경우가 있으면 1을 없으면 0을 return 하도록 solution 함수를 완성해보세요.
 */
public class H120875 {
	public int solution(int[][] dots) {
		int answer = 0;

		double[] slopes = new double[3];
		slopes[0] = (double) (dots[1][1] - dots[0][1]) / (dots[1][0] - dots[0][0]) - (double) (dots[3][1] - dots[2][1]) / (dots[3][0] - dots[2][0]);
		slopes[1] = (double) (dots[2][1] - dots[0][1]) / (dots[2][0] - dots[0][0]) - (double) (dots[3][1] - dots[1][1]) / (dots[3][0] - dots[1][0]);
		slopes[2] = (double) (dots[2][1] - dots[1][1]) / (dots[2][0] - dots[1][0]) - (double) (dots[3][1] - dots[0][1]) / (dots[3][0] - dots[0][0]);

		for (double slope : slopes) {
			if (Math.abs(slope) < 1e-9) {
				answer = 1;
				break;
			}
		}

		return answer;
	}
}

하루종일 걸렸네요..

다른사람의 풀이

import java.lang.Math;
class Solution {
    private int xPos = 0;
    private int yPos = 1;
    private int[][] checkCases = {{0, 1, 2, 3}, {0, 2, 1, 3}, {0, 3, 1, 2}};
    public int solution(int[][] dots) {
        int answer = 0;
        for (int[] checkCase : checkCases) {
            if (checkParallel(checkCase, dots)) {
                answer = 1;
                break;
            }
        }

        return answer;
    }

    private boolean checkParallel(int[] checkCase, int[][] dots) {
        int xPos1 = dots[checkCase[0]][xPos];
        int yPos1 = dots[checkCase[0]][yPos];
        int xPos2 = dots[checkCase[1]][xPos];
        int yPos2 = dots[checkCase[1]][yPos];
        int xPos3 = dots[checkCase[2]][xPos];
        int yPos3 = dots[checkCase[2]][yPos];
        int xPos4 = dots[checkCase[3]][xPos];
        int yPos4 = dots[checkCase[3]][yPos];
        // (y4 - y3)(x2 - x1) - (x4 - x3)(y2 - y1) 평행여부 조건
        int chk = ((yPos4 - yPos3) * (xPos2 - xPos1)) - ((xPos4 - xPos3) * (yPos2 - yPos1));
        if (chk == 0) {
            return true;
        }
        return false;
    }
}
import java.util.HashMap;
import java.util.Map;

class Solution {
    public int solution(int[][] dots) {

        Map<Double, Double> straightInfoMap = new HashMap<>();

        for (int i = 0; i < dots.length - 1; i++) {
            for (int j = i + 1; j < dots.length; j++) {
                double slope = Math.abs((double) (dots[j][1] - dots[i][1]) / (double) (dots[j][0] - dots[i][0]));
                double y_intercept =  ((double) (dots[j][1]) - slope * dots[j][0]);
                if (straightInfoMap.containsKey(slope) && straightInfoMap.get(slope) != y_intercept)
                    return 1;
                straightInfoMap.put(slope, y_intercept);
            }
        }

        System.out.println(straightInfoMap);

        return 0;
    }
}

역시 알고리즘은.. 풀이가 너무 많아요..

항상다른사람의 풀이를 통해 배우고 갑니다!! 오늘은 코드 리뷰로 채울 생각!!

저도 HashMap으로 잘 풀고 싶은데.. 아직 이걸 제대로 이해하지 못해서 제대로 활용한 게 손에 꼽히네요 ㅠㅠ

728x90
반응형
LIST

'알고리즘 > 프로그래머스 JAVA LV.0' 카테고리의 다른 글

왼쪽 오른쪽  (0) 2023.05.07
주사위 게임 3  (0) 2023.05.07
배열 만들기 4  (0) 2023.05.06
배열 만들기 6  (0) 2023.05.06
문자열 출력하기  (0) 2023.05.06

+ Recent posts