공log/[P&B]

[P&B] #36 PreCodingTest

ming_OoO 2023. 8. 23. 14:54
728x90

프리코딩테스트 3-3

 

2) Boat 👀

오답 노트 코드

import java.util.Arrays;

public class BoatProblem {

    public static int solve(int[] People, int limit) {
        Arrays.sort(People);

        int count = 0;
        int sum = 0;
        for (int i = 0; i < People.length; i++) {
            if (sum + People[i] <= limit) {
                sum += People[i];
            } else {
                count++;
                sum = People[i];
            }
        }

        return count + 1;
    }

}

 

문제 풀이 코멘트

  1. 반복문을 통해 배열 People의 각 요소에 대해 처리합니다. 현재까지 누적된 사람들의 무게를 sum 변수에 더하고, 만약 누적된 무게가 보트의 무게 제한 limit보다 작거나 같으면 해당 사람을 보트에 태우는 것이 가능합니다. 그렇지 않은 경우 새로운 보트가 필요하므로 count를 증가시키고, sum을 현재 사람의 무게로 초기화합니다.
  2. 마지막 보트 사용 횟수 계산: 마지막 남은 사람들을 위해 count를 1 증가시킵니다. 마지막 보트에 최대 2명의 사람을 태울 수 있습니다.

이렇게 풀었을때 풀리긴하는데 몸무게를 순서대로만 태워지는 코드인것 같아 맞는 코드인지 의문이 든다.

 

3) Card Game

오답 노트 코드

import java.util.stream.*;
class Solution {
    public static int solution(int[] A) {
        int answer = 0;
        Arrays.sort(A);
        List<Integer> list = new ArrayList<>(Arrays.stream(A).boxed().collect(Collectors.toList()));
        int p = A.length / 2;
        List<Integer> result = new ArrayList<>();
        while (!list.isEmpty()) {
            result.add(list.get(p));
            list.remove(p);
            if(result.size() % 2 != 0) {
                p--;
            }
        }
        for (int i = 0; i < result.size(); i++) {
            if ((i + 1) % 2 == 0) {
                answer += result.get(i) * (-i - 1);
            } else {
                answer += result.get(i) * (i + 1);
            }
        }
        return answer;
    }
    
    public static void main(String[] args) {
        int[] A = {1, 2, 3, 4, 5};
        int result = solution(A);
        System.out.println(result); // 출력: 32
    }
}

 

문제 풀이 코멘트

  1. 중간값 계산: 중간값을 구하기 위해 배열 길이 A.length를 2로 나눈 값인 p를 계산합니다. 여기서 p는 중간 인덱스를 나타냅니다. 이렇게 하는 이유는 나중에 배열을 중간을 기준으로 나눠서 홀수 번째와 짝수 번째의 카드를 번갈아 선택하기 위함입니다.
  2. 리스트 생성 및 반복: 먼저 정렬된 배열 A를 리스트로 변환하여 list에 저장합니다. 그리고 result 리스트를 생성합니다. 이후 반복문을 통해 list에서 카드를 선택하고 result 리스트에 추가합니다. result 리스트는 최종적으로 홀수 번째와 짝수 번째로 나눠진 카드가 번갈아 선택될 때의 순서를 저장하는 곳입니다. 선택할 때마다 p를 갱신하여 번갈아가며 홀수 번째와 짝수 번째 카드를 선택하도록 합니다. result에는 list에서 p번째 위치의 카드를 추가하고, 그 위치의 카드는 list에서 제거합니다. 그 후에 result.size()가 홀수인 경우에는 p 값을 1 감소시켜서 홀수 번째와 짝수 번째를 번갈아 선택하도록 합니다.
  3. 점수 계산: result 리스트의 각 카드에 대해 홀수 번째와 짝수 번째에 따라 곱셈을 수행하고, 이를 점수 answer에 누적하여 계산합니다.

이 문제는 유독 어려웠고 답안 풀이를 보아도 이해하는데 시간이 걸렸다. 특히 배열을 중간을 기준으로 나눠서 홀수 번째와 짝수 번째의 카드를 번갈아 선택하도록 한다는 부분이 가장 생각하기 어려웠던 것 같다. 

5) Fruits

오답 노트 코드

import java.util.*;
import java.util.stream.*;

class Solution {
    public static int solution(int[] fruits) {
        long num = Long.MIN_VALUE;
        for (int i = 0; i < fruits.length; i++) {
            for (int j = fruits.length; j > i; j--) {
                int sum = Arrays.stream(Arrays.copyOfRange(fruits, i, j)).sum();
                num = Math.max(num, sum);
            }
        }
        return (int) num;
    }
}

 

문제 풀이 코멘트

  1. 구간 합 계산: 내부 반복문에서는 배열 fruits의 i부터 j까지의 부분 배열을 만들어 합을 계산합니다. 이를 위해 Arrays.copyOfRange를 사용하여 부분 배열을 생성하고, Arrays.stream을 사용하여 합을 계산합니다.
  2. 최대 점수 갱신: 각 구간의 합을 num과 비교하여 더 큰 값으로 num을 갱신합니다.
  3. 최종 결과 반환: 반복문이 모두 종료된 후, 최대 점수인 num을 반환합니다.

stream을 사용하여 문제를 간결한 코드로 해결한 것이 인상적이었다. stream이 어렵긴하지만 잘 활용만 하면 쉽게 코드를 짤 수 있는 것 같아 공부를 많이 해보는 것이 좋을 듯하다.

728x90

'공log > [P&B]' 카테고리의 다른 글

[P&B] #38 PreCodingTest  (0) 2023.08.25
[P&B] #37 PreCodingTest  (0) 2023.08.24
[P&B] #35 PreCodingTest  (0) 2023.08.22
[P&B] #34 PreCodingTest  (0) 2023.08.21
[P&B] #33 PreCodingTest  (0) 2023.08.20