매일 Algorithm SW 마에스트로 2차 테스트 준비

신재원·2023년 3월 1일
0

Algorithm

목록 보기
52/243
/*
두 배열의 원소 교체
문제
동빈이는 두 개의 배열 A와 B를 가지고 있다. 
두 배열은 N개의 원소로 구성되어 있으며, 배열의 원소는
모두 자연수이다

동빈이는 최대 K 번의 바꿔치기 연산을 수행할 수 있는데, 
바꿔치기 연산이란 배열 A에 있는 원소 하나와
배열 B에 있는 원소 하나를 골라서 두 원소를 서로 바꾸는 것을 말한다

동빈이의 최종 목표는 배열 A의 모든 원소의 합이 최대가 되도록 하는 것이며, 
여러분은 동빈이를 도와야한다

N, K, 그리고 배열 A와 B의 정보가 주어졌을 때, 
최대 K 번의 바꿔치기 연산을 수행하여 만들 수 있는
배열 A의 모든 원소의 합의 최댓값을 출력하는 프로그램을 작성하라

예를 들어 N = 5, K = 3이고, 배열 A와 B가 다음과 같다고 해보자

배열 A = [1, 2, 5, 4, 3]

배열 B = [5, 5, 6, 6, 5]
이 경우, 다음과 같이 세 번의 연산을 수행할 수 있다

연산 1) 배열 A의 원소 '1'과 배열 B의 원소 '6'을 바꾸기

연산 2) 배열 A의 원소 '2'와 배열 B의 원소 '6'을 바꾸기

연산 3) 배열 A의 원소 '3'과 배열 B의 원소 '5'를 바꾸기
세 번의 연산 이후 배열 A와 배열 B의 상태는 다음과 같이 구성될 것이다

배열 A = [6, 6, 5, 4, 5]

배열 B = [3, 5, 1, 2, 5]
이때 배열 A의 모든 원소의 합은 26이 되며, 이보다 더 합을 크게 만들 수는 없다

입력
첫 번째 줄: N, K 가 공백으로 구분되어 입력 (1 <= N <= 100,000, 0 <= K <= N)
두 번째 줄: 배열 A의 원소들이 공백으로 구분되어 입력 (원소 a < 10,000,000인 자연수)
세 번째 줄: 배열 B의 원소들이 공백으로 구분되어 입력 (원소 b < 10,000,000인 자연수)
출력
최대 K번 바꿔치기 연산을 수행해서 가장 최대의 합을 갖는 A의 모든 원소 값의 합을 출력
입력 예시

5 3
1 2 5 4 3
5 5 6 6 5
출력 예시

26
*/
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

public class problem136 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int size = in.nextInt();
        int c = in.nextInt();

        int[] arr = new int[size];
        Integer[] brr = new Integer[size];

        for (int j = 0; j < size; j++) {
            arr[j] = in.nextInt();

        }
        for(int i = 0; i < size; i++){
            brr[i] = in.nextInt();
        }
        Arrays.sort(arr);
        Arrays.sort(brr, Collections.reverseOrder());

        for (int k = 0; k < c; k++) {

            if (arr[k] < brr[k] ) {
                // brr에 있는 배열의 값이 더 클경우 arr배열과 값을 변경한다.
                int temp = arr[k];
                arr[k] = brr[k];
                brr[k] = temp;
            }
            // brr에 있는 배열보다 arr에 있는 배열의 값이 더 클경우 break;
            else
                break;
        }
        int result = 0 ;
        for(int i = 0; i < arr.length; i++){
            result += arr[i];
        }
        System.out.print(result);
    }
}
/*
문제
오늘 동빈이는 여행 가신 부모님을 대신해서 떡집 일을 하기로 했다.
오늘은 떡볶이 떡을 만드는 날이다.
동빈이네 떡볶이 떡은 재밌게도 떡볶이 떡의 길이가 일정하지 않다.
대신에 한 봉지 안에 들어가는 떡의 총 길이는 절단기로 잘라서 맞춰준다.
절단기에 높이(H)를 지정하면 줄지어진 떡을 한 번에 절단한다.
높이가 H보다 긴 떡은 H 위의 부분이 잘릴 것이고, 낮은 떡은 잘리지 않는다.
예를 들어 높이가 19, 14, 10, 17cm 인 떡이 나란히 있고 절단기 높이를 15cm로 지정하면
자른 뒤 떡의 높이는 15, 14, 10, 15cm가 될 것이다.
잘린 떡의 길이는 차례대로 4, 0, 0, 2cm이다.
손님은 6cm만큼의 길이를 가져간다.
손님이 왔을 때 요청한 총 길이가 M일 때, 
적어도 M만큼의 떡을 얻기 위해 절단기에 설정할 수 있는 높이의 최댓값을 구하는 프로그램을 작성하세요.
입력 조건
첫째 줄에 떡의 개수 N과 요청한 떡의 길이 M이 주어진다. (1 <= N <= 1,000,000, 1 <= M <= 2,000,000,000)
둘째 줄에는 떡의 개별 높이가 주어진다. 
떡 높이의 총합은 항상 M 이상이므로, 손님은 필요한 양만큼 떡을 사갈 수 있다.
높이는 10억보다 작거나 같은 양의 정수 또는 0 이다.
출력 조건
적어도 M만큼의 떡을 집에 가져가기 위해 절단기에 설정할 수 있는 높이의 최댓값을 출력한다.
*/
import java.util.Arrays;
import java.util.Scanner;

public class problem137 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int size = in.nextInt();
        int h = in.nextInt();
        int[] arr = new int[size];

        for (int i = 0; i < size; i++) {
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr);
        // 배열의 끝값을 정해준다.
        int max = arr[size - 1];

        // 최적화 문제를 예, 아니오로 해결
        while (true) {
            // 잘린 떡을 담을 변수
            int sum = 0;
            for (int temp : arr) {
                if (temp >= max) {
                    sum += temp - max;
                }
            }
            // 시간이 지날수록 입력된 
            if (sum == h) break;
            // 끝값을 점점 내린다.
            max--;
        }
        System.out.print(max);
    }
}

프로그래머스 SQL JOIN (SW 마에스트로 2차 테스트 준비)


SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE,'%Y-%m-%d') 
AS REVIEW_DATE
FROM MEMBER_PROFILE M JOIN REST_REVIEW R ON
M.MEMBER_ID = R.MEMBER_ID
WHERE M.MEMBER_ID = 
## 우선 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 (LIMIT 1)
(SELECT MEMBER_ID FROM REST_REVIEW
GROUP BY MEMBER_ID
## MEMBER_ID의 COUNT를 내림차순 하여 가장 많이 작성한 MEMBER_ID를 자른다. 
ORDER BY COUNT(*) DESC LIMIT 1)
ORDER BY R.REVIEW_DATE ASC, R.REVIEW_TEXT;
/*
문제
N개의 원소를 포함하고 있는 수열이 오름차순으로 정렬되어 있습니다. 
이때 이 수열에서 x가 등장하는 횟수를 계산하세요.
단, 이 문제의 시간 복잡도 O(logN)으로 알고리즘을 설계하지 않으면 
'시간 초과' 판정을 받습니다.

입력 예시
7 2
1 1 2 2 2 2 3

출력 예시
4
*/
import java.util.Arrays;
import java.util.Scanner;

public class problem138 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int size = in.nextInt();
        int match = in.nextInt();
        int [] arr = new int [size];
        int [] total = new int [size];
        for(int i = 0; i < size; i++){
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr);

        for(int i = 0; i < arr.length; i++){
            // 입력한 배열의 값에 따라 total 배열의 인덱스 값을 증가시켜준다.
            total[arr[i]]++;
        }
        // 찾고자 하는 값 
        // 인덱스에 담겨있는 갯수를 반환한다.
        System.out.print(total[match]);

    }
}

/*
음료수 얼려 먹기
문제
N × M 크기의 얼음 틀이 있다. 
구멍이 뚫려 있는 부분은 0, 칸막이가 존재하는 부분은 1로 표시된다.
구멍이 뚫려 있는 부분끼리 
상, 하, 좌, 우로 붙어 있는 경우 서로 연결되어 있는 것으로 간주한다.
이때 얼음 틀의 모양이 주어졌을 때 생성되는 
총 아이스크림의 개수를 구하는 프로그램을 작성하라.
다음의 4 × 5 얼음 틀 예시에서는 아이스크림이 총 3개가 생성된다


입력

첫 번째 줄에 얼음 틀의 세로 길이 N과 가로 길이 M이 주어진다. (1 <= N, M <= 1,000)
두 번째 줄부터 N + 1 번째 줄까지 얼음 틀의 형태가 주어진다.
이때 구멍이 뚫려있는 부분은 0, 그렇지 않은 부분은 1이다.
출력

한 번에 만들 수 있는 아이스크림의 개수를 출력한다.

입력 예시 1

4 5
00110
00011
11111
00000
출력 예시 1

3

입력 예시 2

15 14
00000111100000
11111101111110
11011101101110
11011101100000
11011111111111
11011111111100
11000000011111
01111111111111
00000000011111
01111111111000
00011111111000
00000001111000
11111111110011
11100011111111
11100011111111
출력 예시2

8
*/
import java.util.Scanner;

public class problem133 {
    public static int n;
    public static int m;
    public static int[][] frame;

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        in.nextLine(); // 버퍼 비우기
        frame = new int[n][m];

        for (int i = 0; i < n; i++) {
            /**
             * 중요한 부분 한 줄 한 줄 입력받는것을 String으로 받는다.
             */
            String st = in.nextLine();
            for (int j = 0; j < m; j++) {
                // 아스키값 0을 빼줌으로써 정수로 담는다.
                frame[i][j] = st.charAt(j) - '0';
            }
        }

        System.out.print(result());
    }

    public static int result() {
        int result = 0;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 0 : 구멍이 뚫려있어, 아이스크림을 만들수있다.
                if (frame[i][j] == 0) {
                    dfs(i, j);
                    result++;
                }
            }
        }
        return result;
    }

    public static boolean dfs(int a, int b) {
        if(a < 0 || a >= n || b < 0 || b >= m ) {
            return false;
        }
        if (frame[a][b] == 0) {
            // 방문한 노드 처리
            frame[a][b] = 1;

            // 상 하 좌 우 를 노드로 묶어 재귀함수 처리한다.
            dfs(a - 1, b);
            dfs(a + 1, b);
            dfs(a, b - 1);
            dfs(a, b + 1);
            return true;
        }
        return false;
    }
}

백준 1931 (그리디)

import java.util.*;
public class problem139 {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int size = in.nextInt();
        int [][] arr = new int[size][2];

        for(int i = 0; i < size; i++){
            arr[i][0] = in.nextInt(); // 시작시각
            arr[i][1] = in.nextInt(); // 종료시각
        }

        Arrays.sort(arr, (o1, o2) ->{
            // 종료시각이 같을 경우 (
            if(o1[1] == o2[1]){
                return o1[0] - o2[0]; // 시작 시각이 빠른순으로 (오름차순)
                //  o2[0] - o1[0] 시작 시각 순으로 내림차순
            }
            // 종료 시각으로 오름차순
            return o1[1] - o2[1];
        });

        int count = 0;
        int end = 0;

        for(int i = 0; i < size; i++){
            if(end <= arr[i][0]){
                // 종료시각을 변경
                end = arr[i][1];
                count++;
            }
        }
        System.out.print(count);
    }
}

백준 2217번 (그리디)

import java.util.*;
public class problem140 {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int size = in.nextInt();
        int [] arr = new int [size];
        for(int i = 0; i < size; i++){
            arr[i] = in.nextInt();
        }

        Arrays.sort(arr);
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < arr.length; i++){
            
            /**
             * 입력값 : size = 2 
             * 10 15 인 경우는 로프 2개를 사용하여 최대 20을 들수있다.
             */
            // 로프 한개만 사용 할수도있음으로, max값을 구해준다.
            max = Math.max(max, arr[i] * (size - i));
        }

        System.out.print(max);
    }
}

백준 1789번 (그리디)

import java.util.*;
public class problem141 {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long n = in.nextLong();

        long sum = 0L;
        if(n == 1 || n == 2){
            System.out.print(1);
            return;
        }
        for(int i = 0; i < n; i++){
            sum += i;
            if(sum > n){
                /* 1부터 순서대로 더하면 210이라는 값이 나온다
                 최대 갯수로 200을 만들수 있는 수 이니까 1 ~ 20 까지 더한후, 
                */ 10을 빼주면된다 (갯수1개).
                System.out.print(i - 1);
                break;
            }else if (sum == n){
                System.out.print(i);
                break;
            }
        }

    }
}

0개의 댓글