728x90
반응형

📝문제

더보기

1. 문제 설명

과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.

  • 한 상자에 사과를 m개씩 담아 포장합니다.
  • 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.

과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)

예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.

  • (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8

사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ k ≤ 9
  • 3 ≤ m ≤ 10
  • 7 ≤ score의 길이 ≤ 1,000,000
    • 1 ≤ score[i] ≤ k
  • 이익이 발생하지 않는 경우에는 0을 return 해주세요.

2. 입출력 예

k m score result
3 4 [1, 2, 3, 1, 2, 3, 1] 8
4 3 [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] 33

3. 입출력 예 설명

  • 입출력 예 #1
    문제의 예시와 같습니다.

  • 입출력 예 #2
    다음과 같이 사과 상자를 포장하여 모두 팔면 최대 이익을 낼 수 있습니다.
사과 상자가격
[1, 1, 2] 1 x 3 = 3
[2, 2, 2] 2 x 3 = 6
[4, 4, 4] 4 x 3 = 12
[4, 4, 4] 4 x 3 = 12

따라서 (1 x 3 x 1) + (2 x 3 x 1) + (4 x 3 x 2) = 33을 return합니다.

📝작성한 코드

1. 처음 작성한 코드

 과일장수가 최대의 이익을 얻기 위해선 m만큼 과일을 담을 때 담아지는 과일의 수가 딱 떨어지지 않아 1상자를 완성하지 못하고 남아버릴 경우 남아진 과일은 점수가 낮은 과일이여야 하므로 가장 점수가 높은 과일부터  담아져야 한다. 가격을 계산 할 때는 한 상자에 같은 점수의 과일이 담아져 있지 않은 경우 그 상자에서 가장 점수가 낮은 과일을 기준으로 가격을 계산해야 한다. 그렇기 때문에 점수를 오름차순으로 정렬하여 가장 첫번째 과일의 점수로 1상자의 가격을 계산해야 한다.

  • Arrays.sort(score) : score에서 큰 수 부터 차례대로 뽑아오기 위해 오름차순으로 정렬하였다.
  • for문 : score의 값들을 차례대로 뽑아오면서 계산을 하기 위해 for문을 작성했다. k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] 라고 생각해보면 i의 처음 값은 -3이며 이 값은  -score.length보다 크거나 같으므로 -12보다 작아 질 수 없다. for문이 돌아가면 score[-3]인 4가 m인 3과 곱해지고 12라는 값이 answer에 들어간다. for문이 실행됐으니까 i -= m 이 실행 되면서 i는 -6이 된다.

하지만 실행하면 ArrayIndexOutOfBoundsException 오류가 떴다. 이 오류는 배열 인덱스가 배열 길이를 벗어나는 경우에 발생한다. 오류 메시지에서 "Index -3 out of bounds for length 12"가 나오는데, 이는 배열의 길이가 12이고 인덱스 -3에 접근하려고 하고 있다는 것을 의미한다. 

 즉, 자바에서 배열의 인덱스에 접근할 때 음수 사용이 불가능 하다는 것이다. 배열 인덱스는 음이 아닌 정수여야 한다. 그러나 나는  for문에서 i를 -m으로 주면서 score[-3]라는 코드가 나왔기 때문에 오류가 났던 것이다.

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;
        Arrays.sort(score); 
        // System.out.println(Arrays.toString(score));   
        	// [1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4]
       
        for (int i = -m; i >= -score.length; i -= m){           
             answer += score[i] * m ;
        }
        
        return answer;
    }
}

 

2. 수정한 코드

 수정한 코드에서는 i를  score.length로 주었다. k = 4, m = 3, score =[4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]라고 생각해보면 i의 초기값은 12이고 i >= m만큼 반복 하므로 i는 3보다 크거나 같을 때까지 반복한다. for문이 실행되면 score[9] 인 4에 m인 3이 곱해져  12라는 값이 answer에 들어간다. for문이 실행됐으니까 i -= m 이 실행 되면서 i는 9가 된다.

 이렇게 조건을 주면 배열의 인덱스에 음수를 넣지 않고도 원하는 값을 가져올 수 있다.

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;
        Arrays.sort(score); 
        // System.out.println(Arrays.toString(score));   
        	// [1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4]

        for(int i = score.length; i >= m; i -= m){
             answer += score[i - m] * m;
        }
 
        return answer;
    }
}

728x90
반응형
728x90
반응형

📝문제 1 - 평균 일일 대여 요금 구하기

더보기

1. 문제 설명

다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며 CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

Column name  Type  Nullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(예: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.


2. 문제

CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.


3. 예시

예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면

CAR_ID CAR_TYPE DAILY_FEE OPTIONS
1 세단 16000 가죽시트,열선시트,후방카메라
2 SUV 14000 스마트키,네비게이션,열선시트
3 SUV 22000 주차감지센서,후방카메라,가죽시트

 

'SUV' 에 해당하는 자동차들의 평균 일일 대여 요금은 18,000 원 이므로, 다음과 같은 결과가 나와야 합니다.

AVERAGE_FEE
18000

✏️ 작성한 코드

SELECT ROUND(AVG(DAILY_FEE)) as AVERAGE_FEE
from CAR_RENTAL_COMPANY_CAR
where CAR_TYPE = 'SUV'
GROUP BY CAR_TYPE;

 

📝문제 2 - 조건에 맞는 도서 리스트 출력하기

더보기

1. 문제 설명

다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK) 테이블입니다. BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

Column name Type Nullable Description
BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일

2. 문제

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.결과는 출판일을 기준으로 오름차순 정렬해주세요.


3. 예시

예를 들어 BOOK 테이블이 다음과 같다면

BOOK_ID CATEGORY AUTHOR_ID PRICE PUBLISHED_DATE
1 인문 1 10000 2020-01-01
2 경제 2 9000 2021-02-05
3 인문 2 11000 2021-04-11
4 인문 3 10000 2021-03-15
5 생활 1 12000 2021-01-10

 

조건에 속하는 도서는 도서 ID 가 3, 4인 도서이므로 다음과 같습니다.

BOOK_ID PUBLISHED_DATE
3 2021-04-11
4 2021-03-15

 

그리고 출판일 오름차순으로 정렬하여야 하므로 다음과 같은 결과가 나와야 합니다.

BOOK_ID PUBLISHED_DATE
4 2021-03-15
3 2021-04-11

4. 주의사항

PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.

✏️ 작성한 코드

SELECT BOOK_ID
	, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') as PUBLISHED_DATE
from BOOK
where PUBLISHED_DATE like '2021%'
    AND CATEGORY = '인문'
order by PUBLISHED_DATE;

 

728x90
반응형
728x90
반응형

📝 문제

더보기

1. 문제 설명

코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.

컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.

  • 드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdxrdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, "점 S에서 점 E로 드래그한다"고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.
  • 점 S(luxluy)에서 점 E(rdxrdy)로 드래그를 할 때, "드래그 한 거리"는 |rdx lux| + |rdy luy|로 정의합니다.
  • 점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.

예를 들어 wallpaper = [".#...", "..#..", "...#."]인 바탕화면을 그림으로 나타내면 다음과 같습니다

이러한 바탕화면에서 다음 그림과 같이 S(0, 1)에서 E(3, 4)로 드래그하면 세 개의 파일이 모두 선택되므로 드래그 한 거리 (3 - 0) + (4 - 1) = 6을 최솟값으로 모든 파일을 선택 가능합니다.

(0, 0)에서 (3, 5)로 드래그해도 모든 파일을 선택할 수 있지만 이때 드래그 한 거리는 (3 - 0) + (5 - 0) = 8이고 이전의 방법보다 거리가 늘어납니다.

 

머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열 wallpaper가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는 solution 함수를 작성해 주세요. 드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy)라면 정수 배열 [lux, luy, rdx, rdy]를 return하면 됩니다.


2. 제한사항

  • 1 ≤ wallpaper의 길이 ≤ 50
  • 1 ≤ wallpaper[i]의 길이 ≤ 50
    wallpaper의 모든 원소의 길이는 동일합니다.
  • wallpaper[i][j]는 바탕화면에서 i + 1행 j + 1열에 해당하는 칸의 상태를 나타냅니다.
  • wallpaper[i][j]는 "#" 또는 "."의 값만 가집니다.
  • 바탕화면에는 적어도 하나의 파일이 있습니다.
  • 드래그 시작점 (luxluy)와 끝점 (rdxrdy)는 lux rdxluy rdy를 만족해야 합니다.

3. 입출력 예

wallpaper result
[".#...", "..#..", "...#."] [0, 1, 3, 4]
["..........", ".....#....", "......##..", "...##.....", "....#....."] [1, 3, 5, 8]
[".##...##.", "#..#.#..#", "#...#...#", ".#.....#.", "..#...#..", "...#.#...", "....#...."] [0, 0, 7, 9]
["..", "#."] [1, 0, 2, 1]

 

4. 입출력 예

  • 입출력 예 #1
     문제 설명의 예시와 같은 예제입니다. (0, 1)에서 (3, 4)로 드래그 하면 모든 파일을 선택할 수 있고 드래그 한 거리는 6이었고, 6보다 적은 거리로 모든 파일을 선택하는 방법은 없습니다. 따라서 [0, 1, 3, 4]를 return합니다.

  • 입출력 예 #2
     예제 2번의 바탕화면은 다음과 같습니다.(1, 3)에서 (5, 8)로 드래그하면 모든 파일을 선택할 수 있고 이보다 적은 이동거리로 모든 파일을 선택하는 방법은 없습니다. 따라서 가장 적은 이동의 드래그로 모든 파일을 선택하는 방법인 [1, 3, 5, 8]을 return합니다.

 

  • 입출력 예 #3
     예제 3번의 바탕화면은 다음과 같습니다.모든 파일을 선택하기 위해선 바탕화면의 가장 왼쪽 위 (0, 0)에서 가장 오른쪽 아래 (7, 9)로 드래그 해야만 합니다. 따라서 [0, 0, 7, 9]를 return합니다.

 

  • 입출력 예 #4
     예제 4번의 바탕화면은 다음과 같이 2행 1열에만 아이콘이 있습니다.이를 드래그로 선택하기 위해서는 그 칸의 왼쪽 위 (1, 0)에서 오른쪽 아래 (2, 1)로 드래그 하면 됩니다. (1, 0)에서 (2, 2)로 드래그 해도 아이콘을 선택할 수 있지만 이전보다 이동거리가 늘어납니다. 따라서 [1, 0, 2, 1]을 return합니다.

✏️작성한 코드

코드 풀이를 해보자.

일단 X, Y를 행과 열로 생각한다.

  •  int[] X = new int[wallpaper.length]; 
    wallpaper 배열에 들어가 있는 값의 길이 만큼 X, Y도 출력되서 나오므로 X, Y를 wallpaper 만큼의 길이를 가진 리스트로 설정했다.
  • int xMin = Integer.MAX_VALUE;
    X, Y에 들어간 값 중 행의 최솟값과 행의 최댓값, 열의 최솟값과 열의 최댓값을 찾아야 하므로 각각을 변수로 설정한다.  Integer.MAX_VALUE는 JAVA에서의 정수 최댓값을 의미하기 때문에 최솟값을 구하려고 할 때 MAX_VALUE와 비교해야 한다.

  • for 문
    중첩된 루프를 사용하여 wallpaper 배열을 순회하면서 '#' 문자를 찾고, 해당 위치의 행과 열을 XY 배열에 저장하고 최솟값과 최댓값을 업데이트합니다.

  •  Math.min(A, X[i])
    Math.min(a, b)은 두 인자 값 중 작은 값을 리턴한다. 즉, A가 Integer.MAX_VALUE 이므로 X[i]이 그보다 더 클 수 없다. 그러므로 처음 들어오는 X[i]의 값이 A로 리턴되면서 새로 들어오는 X[i]과 비교하여 최소값을 반환하게 된다.

  • xMax = Math.max(C, X[i]+1);
    Max 값에 1을 더해준 이유는 파일이 교차되는 점에 위치해 있는게 아닌 한 개의 구역을 차지하고 있기 때문에 드래그 했을 때 마지막 위치가 구역의 시작이 아닌 마지막이므로 1을 더 해줘야 해야 한다.
class Solution {
    public int[] solution(String[] wallpaper) {
        int[] X = new int[wallpaper.length]; 
        int[] Y = new int[wallpaper.length];

        int xMin = Integer.MAX_VALUE;
        int yMin = Integer.MAX_VALUE;
        int xMax = Integer.MIN_VALUE;
        int yMax = Integer.MIN_VALUE;

        for (int i = 0; i < wallpaper.length; i++) {
            for (int j = 0; j < wallpaper[i].length(); j++) {
                if (wallpaper[i].charAt(j) == '#') {
                    X[i] = i;
                    Y[i] = j;

                    xMin = Math.min(A, X[i]);
                    yMin = Math.min(B, Y[i]);
                    xMax = Math.max(C, X[i]+1);
                   	yMax = Math.max(D, Y[i]+1);
                }
            }
        }

        int[] answer = {xMin, yMin, xMax, yMax};
        return answer;
    }
}

 
728x90
반응형
728x90
반응형

📝 문제

더보기

1. 문제설명

 얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 "mumu", "soe", "poe" 선수들이 순서대로 달리고 있을 때, 해설진이 "soe"선수를 불렀다면 2등인 "soe" 선수가 1등인 "mumu" 선수를 추월했다는 것입니다. 즉 "soe" 선수가 1등, "mumu" 선수가 2등으로 바뀝니다.선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 players와 해설진이 부른 이름을 담은 문자열 배열 callings가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.


2. 제한사항

  • 5 ≤ players의 길이 ≤ 50,000
    - players[i]는 i번째 선수의 이름을 의미합니다.
    - players의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    - players에는 중복된 값이 들어가 있지 않습니다.
    - 3 ≤ players[i]의 길이 ≤ 10

  • 2 ≤ callings의 길이 ≤ 1,000,000
    - callingsplayers의 원소들로만 이루어져 있습니다.
    - 경주 진행중 1등인 선수의 이름은 불리지 않습니다.

3. 입출력 예

players callings result
["mumu", "soe", "poe", "kai", "mine"] ["kai", "kai", "mine", "mine"] ["mumu", "kai", "mine", "soe", "poe"]

4. 입출력 예 설명

  • 입출력 예 #1

 4등인 "kai" 선수가 2번 추월하여 2등이 되고 앞서 3등, 2등인 "poe", "soe" 선수는 4등, 3등이 됩니다. 5등인 "mine" 선수가 2번 추월하여 4등, 3등인 "poe", "soe" 선수가 5등, 4등이 되고 경주가 끝납니다. 1등부터 배열에 담으면 ["mumu", "kai", "mine", "soe", "poe"]이 됩니다.

 

✏️ 작성한 코드

 아래 작성한 코드는 answer를 players와 동일하다고 설정한 뒤 for문을 사용하여 callings와 players를 비교하고 있다. 두 값이 같으면  answer의 현재 인덱스 값이 players의 이전 인덱스 값으로 대체되고, answer의 이전 인덱스 값은 callings의 현재 인덱스 값으로 대체된다.

 입출력 예를 가지고 설명해 보자면, callings[0]인 "kai"와 players[0]인 " mumu" 값이 먼저 비교 되고 값이 같지 않으면 players의 인덱스는 1씩 증가되므로 " mumu", "soe", "poe", "kai", "mine" 순으로 비교 된다. 즉,  callings[0]은 players[3]인 "kai"와 값이 같으므로 이때의 인덱스를 기준으로 answer[3]은 players[3 - 1]인 "poe"로 대체 되고 answer[3-1]인 "poe"는 callings[0]인 "kai"로 바뀌게 되면서 내부 for문이 종료 된다.

 그리고 다시 callings[1]을 players[0]과 비교하면서 for문이 진행된다. 그러나 이렇게 진행할 경우 callings에 해당하는 player를 찾기 위해 반복문을 돌릴때 마다 callings과  players을 비교하게 되므로 효율적이지 못한 코드가 될 수 있다.

class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = players ;
        for (int i = 0; i < callings.length;i++) {    
            for (int j = 0; j < players.length;j++) {
                if (callings[i].equals(players[j])) {
                 answer[j] = players[j - 1];
                 answer[j - 1] = callings[i];
                 break;
                 }
            }
        }
        return answer;       
    }
}

 

결과는 예시와 같이 나오지만 채점 하면 실행 시간 초과로 오답처리 된다. 아마 이 문제도 HashMap을 써야 하는 것 같다. 

✏️수정한 코드

 HaspMap을 사용해 본 코드이다.

  1.  for (int i = 0; i < players.length;i++) {map.put(players[i], i);}
    → 첫번째 for문으로 map에 players의 값을 저장한다.
  2. for (String name : callings)
    두번째 for문을 사용하면 callings에 있는 배열이 하나씩 name이란 변수에 담기면서 실행이 된다.
  3. int cur = map.get(name);
    먼저 배열의 첫번째 값인 "kai"가 name에 담기고 cur은 map에서의 name의 인덱스 값이 담긴다. 즉, map에 있는 "kai"의 인덱스 값인 3이 cur 값이 된다.
  4. map.put(name, cur - 1); 
    map에 (kai, (3 - 1)) 가 들어간다. 즉, map[2]인 "poe"가 "kai"로 변경된다.
  5. map.put(players[cur - 1], cur);
    map에 ( players[3 - 1] , 3) 이 들어간다. 즉, map[3]인 "kai"가  players[2]인  "poe"로 변경된다.
  6.  players[cur] = players[cur - 1];
     players[cur - 1] = name;
    호출된 플레이어와 이전 위치에 있던 플레이어를 서로 교체하여 플레이어들의 위치를 업데이트한다.
import java.util.*;

class Solution {
    public String[] solution(String[] players, String[] callings) {
        
        HashMap<String,Integer> map = new HashMap<>();
        
        for (int i = 0; i < players.length;i++) {   
            map.put(players[i], i);
        }
        
        for (String name : callings) {
            int cur = map.get(name);
            map.put(name, cur - 1);
            map.put(players[cur - 1], cur);
            players[cur] = players[cur - 1];
            players[cur - 1] = name;
        }
        return players;       
    }
}
728x90
반응형
728x90
반응형

📝문제

더보기

1. 문제 설명

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.


Column name Type Nullable 
HISTORY_ID INTEGER FALSE
CAR_ID INTEGER FALSE
START_DATE DATE FALSE
END_DATE DATE FALSE

 


2. 문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.


3. 예시

예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

HISTORY_ID CAR_ID START_DATE END_DATE
1 1 2022-07-27 2022-08-02
2 1 2022-08-03 2022-08-04
3 2 2022-08-05 2022-08-05
4 2 2022-08-09 2022-08-12
5 3 2022-09-16 2022-10-15
6 1 2022-08-24 2022-08-30
7 3 2022-10-16 2022-10-19
8 1 2022-09-03 2022-09-07
9 1 2022-09-18 2022-09-19
10 2 2022-09-08 2022-09-10
11 2 2022-10-16 2022-10-19
12 1 2022-09-29 2022-10-06
13 2 2022-10-30 2022-11-01
14 2 2022-11-05 2022-11-05
15 3 2022-11-11 2022-11-11

 

대여 시작일을 기준으로 총 대여 횟수가 5회 이상인 자동차는 자동차 ID가 1, 2인 자동차입니다. 월 별 자동차 ID별 총 대여 횟수를 구하고 월 오름차순, 자동차 ID 내림차순으로 정렬하면 다음과 같이 나와야 합니다.

MONTHCAR_IDRECORDS
MONTH CAR_ID RECORDS
8 2 2
8 1 2
9 2 1
9 1 3
10 2 2

✏️작성한 코드

 어려웠던 점은 조건을 줄 때 CAR_ID에 대한 조건을 주고 전체 행에 대한 조건을 따로 줘야 한다는 것이다.  먼저 대여 시작일을 기준으로 2022년 8월 부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대한 조건을 서브쿼리로 준다. 그리고 해당 기간 동안의 월별 CAR_ID 별 총 대여 횟수 리스트를 출력한다.

 작성해놓고 왜 이렇게 적었는지 설명을 못하겠다... 헷

SELECT SUBSTRING(START_DATE,6,2) AS MONTH
		, CAR_ID
    	, COUNT(CAR_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (
    		SELECT CAR_ID 
    			FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
   					 WHERE SUBSTRING(START_DATE,1,7) BETWEEN '2022-08' AND '2022-10'
    		GROUP BY CAR_ID
    		HAVING COUNT(CAR_ID) >= 5)
	AND SUBSTRING(START_DATE,1,7) BETWEEN '2022-08' AND '2022-10'
GROUP BY SUBSTRING(START_DATE,6,2), CAR_ID
ORDER BY MONTH, CAR_ID DESC;

 

코드 실행 시 아래와 같은 형식으로 데이터가 출력된다.

728x90
반응형
728x90
반응형

📝 문제

더보기

1. 문제 설명

  사진들을 보며 추억에 젖어 있던 루는 사진별로 추억 점수를 매길려고 합니다. 사진 속에 나오는 인물의 그리움 점수를 모두 합산한 값이 해당 사진의 추억 점수가 됩니다. 예를 들어 사진 속 인물의 이름이 ["may", "kein", "kain"]이고 각 인물의 그리움 점수가 [5점, 10점, 1점]일 때 해당 사진의 추억 점수는 16(5 + 10 + 1)점이 됩니다. 다른 사진 속 인물의 이름이 ["kali", "mari", "don", "tony"]이고 ["kali", "mari", "don"]의 그리움 점수가 각각 [11점, 1점, 55점]]이고, "tony"는 그리움 점수가 없을 때, 이 사진의 추억 점수는 3명의 그리움 점수를 합한 67(11 + 1 + 55)점입니다.

 그리워하는 사람의 이름을 담은 문자열 배열 name, 각 사람별 그리움 점수를 담은 정수 배열 yearning, 각 사진에 찍힌 인물의 이름을 담은 이차원 문자열 배열 photo가 매개변수로 주어질 때, 사진들의 추억 점수를 photo에 주어진 순서대로 배열에 담아 return하는 solution 함수를 완성해주세요.


2. 제한사항

  • 3 ≤ name의 길이 = yearning의 길이≤ 100
    • 3 ≤ name의 원소의 길이 ≤ 7
    • name의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • name에는 중복된 값이 들어가지 않습니다.
    • 1 ≤ yearning[i] ≤ 100
    • yearning[i]는 i번째 사람의 그리움 점수입니다.
  • 3 ≤ photo의 길이 ≤ 100
    • 1 ≤ photo[i]의 길이 ≤ 100
    • 3 ≤ photo[i]의 원소(문자열)의 길이 ≤ 7
    • photo[i]의 원소들은 알파벳 소문자로만 이루어져 있습니다.
    • photo[i]의 원소들은 중복된 값이 들어가지 않습니다.

3. 입출력 예

name yearning photo result
["may", "kein", "kain", "radi"] [5, 10, 1, 3] [["may", "kein", "kain", "radi"], ["may", "kein", "brin", "deny"], ["kon", "kain", "may", "coni"]] [19, 15, 6]
["kali", "mari", "don"] [11, 1, 55] [["kali", "mari", "don"], ["pony", "tom", "teddy"], ["con", "mona", "don"]] [67, 0, 55]
["may", "kein", "kain", "radi"] [5, 10, 1, 3] [["may"], ["kein", "deny", "may"], ["kon", "coni"]] [5, 15, 0]

 


4. 입출력 예 설명

  • 입출력 예 #1

첫 번째 사진 속 "may", "kein", "kain", "radi"의 그리움 점수를 합치면 19(5 + 10 + 1 + 3)점 입니다. 두 번째 사진 속 그리워하는 사람들인 "may"와 "kein"의 그리움 점수를 합치면 15(5 + 10)점입니다. 세 번째 사진의 경우 "kain"과 "may"만 그리워하므로 둘의 그리움 점수를 합한 6(1 + 5)점이 사진의 추억 점수입니다. 따라서 [19, 15, 6]을 반환합니다.

  • 입출력 예 #2

첫 번째 사진 속 그리워하는 사람들인 "kali", "mari", "don"의 그리움 점수를 합치면 67(11 + 1 + 55)점입니다. 두 번째 사진 속엔 그리워하는 인물이 없으므로 0점입니다. 세 번째 사진 속 그리워하는 사람은 "don"만 있으므로 55점입니다. 따라서 [67, 0, 55]를 반환합니다.

✏️ 작성한 코드

 for문을 사용하여 풀었지만 데이터가 많을 경우 효율적이지 못한 코드가 될 수 있으므로 HashMap을 사용하는 것을 추천한다.

  • int[] answer = new int[photo.length]
    - int[]: 정수형 배열을 나타내는 자료형
    - new int[photo.length]: photo 배열의 길이와 같은 크기를 가진 새로운 정수형 배열을 생성
class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        int[] answer = new int[photo.length];
        for (int i = 0; i < name.length ;i++) {
            for (int j = 0; j < photo.length; j++) {
                for (int k = 0; k < photo[j].length; k++){
                    if (photo[j][k].equals(name[i])) {
                            answer[j] += yearning[i];
                  }
                }
              }       
            }
        return answer;
   	   }
       }

✏️ 코딩짱 풀이 

HashMap 사용

import java.util.*;

class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        int[] answer = new int[photo.length];

        HashMap<String, Integer> map = new HashMap<>();
        for(int i = 0; i < name.length; i++) {
            map.put(name[i], yearning[i]);
        }

        int sum;
        for(int i = 0; i < photo.length; i++) {
            sum = 0;
            for(int j = 0; j < photo[i].length; j++) {
                if(map.containsKey(photo[i][j])) 
                    sum += map.get(photo[i][j]);
            }   
            answer[i] = sum;
        }   
        
        return answer;
    }
}
728x90
반응형

+ Recent posts