posted by 코딩 공부중 2022. 2. 11. 17:43

문제 설명

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던전 탐험을 마쳤을 때 소모되는 "소모 피로도"가 있습니다. "최소 필요 피로도"는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, "소모 피로도"는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 "최소 필요 피로도"가 80, "소모 피로도"가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다.

이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 "최소 필요 피로도", "소모 피로도"가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.

제한사항
  • k는 1 이상 5,000 이하인 자연수입니다.
  • dungeons의 세로(행) 길이(즉, 던전의 개수)는 1 이상 8 이하입니다.
    • dungeons의 가로(열) 길이는 2 입니다.
    • dungeons의 각 행은 각 던전의 ["최소 필요 피로도", "소모 피로도"] 입니다.
    • "최소 필요 피로도"는 항상 "소모 피로도"보다 크거나 같습니다.
    • "최소 필요 피로도"와 "소모 피로도"는 1 이상 1,000 이하인 자연수입니다.
    • 서로 다른 던전의 ["최소 필요 피로도", "소모 피로도"]가 서로 같을 수 있습니다.
입출력 예kdungeonsresult
80 [[80,20],[50,40],[30,10]] 3
입출력 예 설명

현재 피로도는 80입니다.

만약, 첫 번째 → 두 번째 → 세 번째 던전 순서로 탐험한다면

  • 현재 피로도는 80이며, 첫 번째 던전을 돌기위해 필요한 "최소 필요 피로도" 또한 80이므로, 첫 번째 던전을 탐험할 수 있습니다. 첫 번째 던전의 "소모 피로도"는 20이므로, 던전을 탐험한 후 남은 피로도는 60입니다.
  • 남은 피로도는 60이며, 두 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 50이므로, 두 번째 던전을 탐험할 수 있습니다. 두 번째 던전의 "소모 피로도"는 40이므로, 던전을 탐험한 후 남은 피로도는 20입니다.
  • 남은 피로도는 20이며, 세 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 30입니다. 따라서 세 번째 던전은 탐험할 수 없습니다.

만약, 첫 번째 → 세 번째 → 두 번째 던전 순서로 탐험한다면

  • 현재 피로도는 80이며, 첫 번째 던전을 돌기위해 필요한 "최소 필요 피로도" 또한 80이므로, 첫 번째 던전을 탐험할 수 있습니다. 첫 번째 던전의 "소모 피로도"는 20이므로, 던전을 탐험한 후 남은 피로도는 60입니다.
  • 남은 피로도는 60이며, 세 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 30이므로, 세 번째 던전을 탐험할 수 있습니다. 세 번째 던전의 "소모 피로도"는 10이므로, 던전을 탐험한 후 남은 피로도는 50입니다.
  • 남은 피로도는 50이며, 두 번째 던전을 돌기위해 필요한 "최소 필요 피로도"는 50이므로, 두 번째 던전을 탐험할 수 있습니다. 두 번째 던전의 "소모 피로도"는 40이므로, 던전을 탐험한 후 남은 피로도는 10입니다.

따라서 이 경우 세 던전을 모두 탐험할 수 있으며, 유저가 탐험할 수 있는 최대 던전 수는 3입니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.*;
class Solution {
    static int num = 0;
    static List<Integer> result = new ArrayList<>();
    void swap(int[][] arr, int n1, int n2) {
        int[] temp = arr[n1];
        arr[n1] = arr[n2];
        arr[n2] = temp;
    }
    
    void check(int k,int[][] dungeons,int count){
        int leng = dungeons.length;
        
        if(count == leng - 1) {
            for(int n=0; n<dungeons.length; n++){
                if(dungeons[n][0<=k){
                    k-=dungeons[n][1];
                    num++;
                 }
            }
            result.add(num);
            num = 0;
            return;
        }
        
        for(int i = count; i < leng; i++) {
            //System.out.println("in for ==="+dungeons[i][0]);
            swap(dungeons, count, i);
            check(k,dungeons, count + 1);
            swap(dungeons, count, i);
        }
    
    }
       
    public int solution(int k, int[][] dungeons) {
        int answer = -1;
        
        check(k,dungeons,0);
        answer = Collections.max(result);
        
        return answer;
    }
}
cs

완전탐색으로 푸는 문제

순열 공부할 것

posted by 코딩 공부중 2022. 2. 10. 16:33

문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

제한 조건
  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
입출력 예sreturn
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.*;
 
class Solution {
    public String solution(String s) {
        String answer = "";
        List<Integer> list = new ArrayList<>();
        
        String[] strArr = s.split("\\s");   //문자열 분할
        
        for(int i=0; i<strArr.length; i++){
            list.add(Integer.parseInt(strArr[i]));
        }
        Collections.sort(list);
        answer += Integer.toString(list.get(0)) + ' ';
        answer += Integer.toString(list.get(list.size()-1));
        
        return answer;
    }
}
cs

정렬만 잘하면 간단하게 해결

posted by 코딩 공부중 2022. 2. 10. 16:31

문제 설명

길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다.
배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)

예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면

  • A에서 첫번째 숫자인 1, B에서 첫번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
  • A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
  • A에서 세번째 숫자인 2, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)

즉, 이 경우가 최소가 되므로 29를 return 합니다.

배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.

제한사항
  • 배열 A, B의 크기 : 1,000 이하의 자연수
  • 배열 A, B의 원소의 크기 : 1,000 이하의 자연수
입출력 예ABanswer
[1, 4, 2] [5, 4, 4] 29
[1,2] [3,4] 10
입출력 예 설명

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

입출력 예 #2
A에서 첫번째 숫자인 1, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 4) 다음, A에서 두번째 숫자인 2, B에서 첫번째 숫자인 3을 뽑아 곱하여 더합니다. (누적된 값 : 4 + 6 = 10)
이 경우가 최소이므로 10을 return 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.*;
class Solution
{
    public int solution(int []A, int []B)
    {
        int answer = 0;
        Arrays.sort(A);
        Arrays.sort(B);
        
        
        for(int i=0; i<A.length; i++){
            answer += (A[i] * B[A.length - 1-i]);
        }
        
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        return answer;
    }
}
cs

 

a는 오름차순 b는 내림차순으로 구해서 계산하면 됨 근데 문제가 좀 이상한거 같다

posted by 코딩 공부중 2022. 2. 10. 16:29

문제 설명

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

  • (a1, a2, a3, ..., an)

튜플은 다음과 같은 성질을 가지고 있습니다.

  1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
  2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
  3. 튜플의 원소 개수는 유한합니다.

원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.

  • {{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}

예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}

와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로

  • {{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
  • {{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
  • {{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}

는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • s의 길이는 5 이상 1,000,000 이하입니다.
  • s는 숫자와 '{', '}', ',' 로만 이루어져 있습니다.
  • 숫자가 0으로 시작하는 경우는 없습니다.
  • s는 항상 중복되는 원소가 없는 튜플을 올바르게 표현하고 있습니다.
  • s가 표현하는 튜플의 원소는 1 이상 100,000 이하인 자연수입니다.
  • return 하는 배열의 길이가 1 이상 500 이하인 경우만 입력으로 주어집니다.

[입출력 예]sresult
"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4]
"{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4]
"{{20,111},{111}}" [111, 20]
"{{123}}" [123]
"{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]
입출력 예에 대한 설명입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

문제 예시와 같습니다.

입출력 예 #3

(111, 20)을 집합 기호를 이용해 표현하면 {{111}, {111,20}}이 되며, 이는 {{20,111},{111}}과 같습니다.

입출력 예 #4

(123)을 집합 기호를 이용해 표현하면 {{123}} 입니다.

입출력 예 #5

(3, 2, 4, 1)을 집합 기호를 이용해 표현하면 {{3},{3,2},{3,2,4},{3,2,4,1}}이 되며, 이는 {{4,2,3},{3},{2,3,4,1},{2,3}}과 같습니다.

 

 

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
32
33
34
35
36
37
38
39
40
import java.util.*;
class Solution {
    //1.문자열 나누기
    
    //2.set에 담기(중복제거)
    
    //3.배열로 리턴
 
    
    public int[] solution(String s) {
        
        Set<Integer> set = new LinkedHashSet<Integer>();  //HashSet생성
        //String result= s.substring(2,s.length()-2).replace(",","");
        String result= s.substring(2,s.length()-2);
        String[] arr = result.split("\\},\\{");
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.length() - s2.length();
            }
        });
        
        for(int i=0; i<arr.length; i++){
            String[] strTmp = arr[i].split(",");
            System.out.println"숫자 == "+strTmp[0]);
            for(int j=0; j<strTmp.length; j++){
               set.add(Integer.parseInt(strTmp[j]));
            }
        }
        System.out.println"set == "+set);
        int[] answer = new int[set.size()];
        ArrayList<Integer> list = new ArrayList<>(set);
        System.out.println"list == "+list);
        for(int i=0; i<list.size(); i++){
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}
cs

중복제거를 위해 set을 사용하는 것이 중요

posted by 코딩 공부중 2022. 2. 8. 18:34

문제 설명

주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.

  • 요금표

기본 시간(분)기본 요금(원)단위 시간(분)단위 요금(원)

180 5000 10 600

 

  • 입/출차 기록

시각(시:분)차량 번호내역

05:34 5961 입차
06:00 0000 입차
06:34 0000 출차
07:59 5961 출차
07:59 0148 입차
18:59 0000 입차
19:09 0148 출차
22:59 5961 입차
23:00 5961 출차

 

  • 자동차별 주차 요금

차량 번호누적 주차 시간(분)주차 요금(원)

0000 34 + 300 = 334 5000 + ⌈(334 - 180) / 10⌉ x 600 = 14600
0148 670 5000 +⌈(670 - 180) / 10⌉x 600 = 34400
5961 145 + 1 = 146 5000
  • 어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.
    • 0000번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.
  • 00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.
  • 누적 주차 시간이 기본 시간이하라면, 기본 요금을 청구합니다.
  • 누적 주차 시간이 기본 시간을 초과하면, 기본 요금에 더해서, 초과한 시간에 대해서 단위 시간 마다 단위 요금을 청구합니다.
    • 초과한 시간이 단위 시간으로 나누어 떨어지지 않으면, 올림합니다.
    • ⌈a⌉ : a보다 작지 않은 최소의 정수를 의미합니다. 즉, 올림을 의미합니다.

주차 요금을 나타내는 정수 배열 fees, 자동차의 입/출차 내역을 나타내는 문자열 배열 records가 매개변수로 주어집니다. 차량 번호가 작은 자동차부터 청구할 주차 요금을 차례대로 정수 배열에 담아서 return 하도록 solution 함수를 완성해주세요.

제한사항

  • fees의 길이 = 4
    • fees[0] = 기본 시간(분)
    • 1 ≤ fees[0] ≤ 1,439
    • fees[1] = 기본 요금(원)
    • 0 ≤ fees[1] ≤ 100,000
    • fees[2] = 단위 시간(분)
    • 1 ≤ fees[2] ≤ 1,439
    • fees[3] = 단위 요금(원)
    • 1 ≤ fees[3] ≤ 10,000
  • 1 ≤ records의 길이 ≤ 1,000
    • records의 각 원소는 "시각 차량번호 내역" 형식의 문자열입니다.
    • 시각, 차량번호, 내역은 하나의 공백으로 구분되어 있습니다.
    • 시각은 차량이 입차되거나 출차된 시각을 나타내며, HH:MM 형식의 길이 5인 문자열입니다.
      • HH:MM은 00:00부터 23:59까지 주어집니다.
      • 잘못된 시각("25:22", "09:65" 등)은 입력으로 주어지지 않습니다.
    • 차량번호는 자동차를 구분하기 위한, `0'~'9'로 구성된 길이 4인 문자열입니다.
    • 내역은 길이 2 또는 3인 문자열로, IN 또는 OUT입니다. IN은 입차를, OUT은 출차를 의미합니다.
    • records의 원소들은 시각을 기준으로 오름차순으로 정렬되어 주어집니다.
    • records는 하루 동안의 입/출차된 기록만 담고 있으며, 입차된 차량이 다음날 출차되는 경우는 입력으로 주어지지 않습니다.
    • 같은 시각에, 같은 차량번호의 내역이 2번 이상 나타내지 않습니다.
    • 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지 않습니다.
    • 아래의 예를 포함하여, 잘못된 입력은 주어지지 않습니다.
      • 주차장에 없는 차량이 출차되는 경우
      • 주차장에 이미 있는 차량(차량번호가 같은 차량)이 다시 입차되는 경우

입출력 예

feesrecordsresult

[180, 5000, 10, 600] ["05:34 5961 IN", "06:00 0000 IN", "06:34 0000 OUT", "07:59 5961 OUT", "07:59 0148 IN", "18:59 0000 IN", "19:09 0148 OUT", "22:59 5961 IN", "23:00 5961 OUT"] [14600, 34400, 5000]
[120, 0, 60, 591] ["16:00 3961 IN","16:00 0202 IN","18:00 3961 OUT","18:00 0202 OUT","23:58 3961 IN"] [0, 591]
[1, 461, 1, 10] ["00:00 1234 IN"] [14841]

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

  • 요금표

기본 시간(분)기본 요금(원)단위 시간(분)단위 요금(원)

120 0 60 591

 

  • 입/출차 기록

시각(시:분)차량 번호내역

16:00 3961 입차
16:00 0202 입차
18:00 3961 출차
18:00 0202 출차
23:58 3961 입차

 

  • 자동차별 주차 요금

차량 번호누적 주차 시간(분)주차 요금(원)

0202 120 0
3961 120 + 1 = 121 0 +⌈(121 - 120) / 60⌉x 591 = 591
  • 3961번 차량은 2번째 입차된 후에는 출차된 내역이 없으므로, 23:59에 출차되었다고 간주합니다.

 

입출력 예 #3

  • 요금표

기본 시간(분)기본 요금(원)단위 시간(분)단위 요금(원)

1 461 1 10

 

  • 입/출차 기록

시각(시:분)차량 번호내역

00:00 1234 입차

 

  • 자동차별 주차 요금

차량 번호누적 주차 시간(분)주차 요금(원)

1234 1439 461 +⌈(1439 - 1) / 1⌉x 10 = 14841
  • 1234번 차량은 출차 내역이 없으므로, 23:59에 출차되었다고 간주합니다.

제한시간 안내

  • 정확성 테스트 : 10초
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import java.util.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;
import java.util.Collections;
import java.lang.Math;
class Solution {
    //2.fees는 고정값
 
    //3.비용 계산하는 함수 따로 만들기
 
    //4.모든 차는 출차되므로 각 자동차별 누적 주차시간을 구함
 
    //5.구한 주차시간을 바탕으로 비용 계산
    int makeFee(int[] fees,Long time){
        //비용계산
        //1.fee의 0은 기본시간 1은 요금 2는 단위시간 3은 단위요금
        int result = 0;
        int value = time.intValue();
        if(value>fees[0]){
           double unit = (double)(value-fees[0])/fees[2];
           result = fees[1+ ((int)Math.ceil(unit) * fees[3]);  
        } else {
            result = fees[1];
        }
        return result;
    }
    
    //차량별 주차시간 계산하는 함수
    long makeTime(String outTime,String inTime){
        try {
            Date format1 = new SimpleDateFormat("HH:mm").parse(outTime);
            Date format2 = new SimpleDateFormat("HH:mm").parse(inTime);
            //두날짜 사이의 시간 차이(ms)를 하루 동안의 ms(24시*60분*60초*1000밀리초) 로 나눈다.
            long diffDay = (format1.getTime() - format2.getTime()) / 60000;
            return diffDay;
        }catch (ParseException e) {
            return 0;
        }
        
    }
    
    public int[] solution(int[] fees, String[] records){
        
        HashMap<String,Long> carMap = new HashMap<String,Long>(); //HashMap생성,차량별 누적시간 저장
        HashMap<String,String> record_map = new HashMap<String,String>(); //입출고 내역 저장하는 맵
        
        //1.문자열 공백으로 구분하고 for문 돌려서 입출고 하나하나 계산
        for(int i=0; i<records.length; i++){
            String[] tmp = records[i].split("\\s");
            if(tmp[2].equals("IN")){
                //입고이면, 마지막이 입출고이므로 배열 마지막으로 확인
                record_map.put(tmp[1],tmp[0]);  //첫번째가 차량번호, 두번째가 시간
            }else{
                //출고이면 입출고 맵에서 같은 차량번호가 있는지 확인하기
                if(record_map.containsKey(tmp[1])){
                    //같은게 있으면 입출고 완료이므로 결과에 넣어줌 
                    //단, 같은 차가 왔다갔다 할 경우를 대비해서 결과 맵에 같은 키가 있으면 값 더해주기
                    if(carMap.containsKey(tmp[1])){
                        //결과 맵에 같은게 있으므로 value를 우선 계산한 다음
                        Long result = makeTime(tmp[0],record_map.get(tmp[1]));
                        //입고시간,출고시간
                        //원래 있던 값에 계산한 값을 더해줌
                        carMap.put(tmp[1],carMap.get(tmp[1]) +result);
                        record_map.remove(tmp[1]);//출고됐으므로 입고에서도 지워줌
                    } else//없으니까 그냥 넣어줌, 출고 - 입고
                        //결과나오면 결과에 넣기
                        carMap.put(tmp[1],makeTime(tmp[0],record_map.get(tmp[1])));//입고시간,출고시간
                        record_map.remove(tmp[1]);//출고됐으므로 입고에서 지워줌
                    }
                }
            }
        }
        
        System.out.println"test record_map == "+record_map);
        //record_map에 값이 남아있으면 23:59분에 출차될 차들임
        if(record_map.size()>0){
            for(String i : record_map.keySet()){ //저장된 key값 확인
                //같은게 있으면 입출고 완료이므로 결과에 넣어줌 
                //단, 같은 차가 왔다갔다 할 경우를 대비해서 결과 맵에 같은 키가 있으면 값 더해주기
                if(carMap.containsKey(i)){
                    //결과 맵에 같은게 있으므로 value를 우선 계산한 다음 -> 출고시간은 고정
                    Long result = makeTime("23:59",record_map.get(i));
                    //입고시간,출고시간
                    //원래 있던 값에 계산한 값을 더해줌
                    carMap.put(i,carMap.get(i) +result);
                } else//없으니까 그냥 넣어줌, 출고 - 입고
                    //결과나오면 결과에 넣기
                    carMap.put(i,makeTime("23:59",record_map.get(i)));//입고시간,출고시간
                }
            }
        }
        System.out.println"test carMap == "+carMap);
        List<Integer> list = new ArrayList<>();
        //carmap 넘겨주고 값 계산해서 리턴, 차량번호가 작은거부터 넣어야함
        // 키로 정렬
        List<String> keyData = new ArrayList<>();
        Set<String> keys = carMap.keySet();
        for (String key : keys) {
            keyData.add(key);
        }
        Collections.sort(keyData);
        for(String i : keyData){
            list.add(makeFee(fees,carMap.get(i)));
        }
        int[] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++){
            answer[i] = list.get(i);
        }
        
        
        return answer;
    }
}
cs

쓸데없는 라이브러리를 너무 많이 사용해 해결했음

런타임에러가 발생해 23시59분에 출차되는 차량을 계산하는 부분을 분석해보니 코드를 그대로 가져다 쓰다가 

for문 안에서 맵에 저장된 값을 계속 지우고 있는 것을 확인하고 수정함

이부분 때문에 한시간 넘게 허비함

posted by 코딩 공부중 2022. 2. 8. 10:10

문제 설명

뉴스 클러스터링

여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다.

개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 "카카오 신입 개발자 공채" 관련 기사를 검색해보았다.

  • 카카오 첫 공채..'블라인드' 방식 채용
  • 카카오, 합병 후 첫 공채.. 블라인드 전형으로 개발자 채용
  • 카카오, 블라인드 전형으로 신입 개발자 공채
  • 카카오 공채, 신입 개발자 코딩 능력만 본다
  • 카카오, 신입 공채.. "코딩 실력만 본다"
  • 카카오 "코딩 능력만으로 2018 신입 개발자 뽑는다"

기사의 제목을 기준으로 "블라인드 전형"에 주목하는 기사와 "코딩 테스트"에 주목하는 기사로 나뉘는 걸 발견했다. 튜브는 이들을 각각 묶어서 보여주면 카카오 공채 관련 기사를 찾아보는 사용자에게 유용할 듯싶었다.

유사한 기사를 묶는 기준을 정하기 위해서 논문과 자료를 조사하던 튜브는 "자카드 유사도"라는 방법을 찾아냈다.

자카드 유사도는 집합 간의 유사도를 검사하는 여러 방법 중의 하나로 알려져 있다. 두 집합 A, B 사이의 자카드 유사도 J(A, B)는 두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값으로 정의된다.

예를 들어 집합 A = {1, 2, 3}, 집합 B = {2, 3, 4}라고 할 때, 교집합 A ∩ B = {2, 3}, 합집합 A ∪ B = {1, 2, 3, 4}이 되므로, 집합 A, B 사이의 자카드 유사도 J(A, B) = 2/4 = 0.5가 된다. 집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의한다.

자카드 유사도는 원소의 중복을 허용하는 다중집합에 대해서 확장할 수 있다. 다중집합 A는 원소 "1"을 3개 가지고 있고, 다중집합 B는 원소 "1"을 5개 가지고 있다고 하자. 이 다중집합의 교집합 A ∩ B는 원소 "1"을 min(3, 5)인 3개, 합집합 A ∪ B는 원소 "1"을 max(3, 5)인 5개 가지게 된다. 다중집합 A = {1, 1, 2, 2, 3}, 다중집합 B = {1, 2, 2, 4, 5}라고 하면, 교집합 A ∩ B = {1, 2, 2}, 합집합 A ∪ B = {1, 1, 2, 2, 3, 4, 5}가 되므로, 자카드 유사도 J(A, B) = 3/7, 약 0.42가 된다.

이를 이용하여 문자열 사이의 유사도를 계산하는데 이용할 수 있다. 문자열 "FRANCE"와 "FRENCH"가 주어졌을 때, 이를 두 글자씩 끊어서 다중집합을 만들 수 있다. 각각 {FR, RA, AN, NC, CE}, {FR, RE, EN, NC, CH}가 되며, 교집합은 {FR, NC}, 합집합은 {FR, RA, AN, NC, CE, RE, EN, CH}가 되므로, 두 문자열 사이의 자카드 유사도 J("FRANCE", "FRENCH") = 2/8 = 0.25가 된다.

입력 형식

  • 입력으로는 str1과 str2의 두 문자열이 들어온다. 각 문자열의 길이는 2 이상, 1,000 이하이다.
  • 입력으로 들어온 문자열은 두 글자씩 끊어서 다중집합의 원소로 만든다. 이때 영문자로 된 글자 쌍만 유효하고, 기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다. 예를 들어 "ab+"가 입력으로 들어오면, "ab"만 다중집합의 원소로 삼고, "b+"는 버린다.
  • 다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. "AB"와 "Ab", "ab"는 같은 원소로 취급한다.

출력 형식

입력으로 들어온 두 문자열의 자카드 유사도를 출력한다. 유사도 값은 0에서 1 사이의 실수이므로, 이를 다루기 쉽도록 65536을 곱한 후에 소수점 아래를 버리고 정수부만 출력한다.

예제 입출력

str1str2answer
FRANCE french 16384
handshake shake hands 65536
aa1+aa2 AAAA12 43690
E=M*C^2 e=m*c^2 65536

해설 보러가기

 

카카오 신입 공채 1차 코딩 테스트 문제 해설

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인

tech.kakao.com

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import java.util.*;
import java.util.List;
import java.util.ArrayList;
class Solution {
    List<String> makeList(String str) {   //각 문자열을 list로 리턴
        List<String> list = new ArrayList<>();      //결과 담아줄 list
        //1.문자열을 2개씩 끊어서 리스트로 만들기 - 공백,숫자.특수문자는 제외
        for(int i=0; i<str.length(); i++){
             String strTmp = "";
            if(i+2<str.length()){
                strTmp = str.substring(i,i+2);
                //list_1.add(str1.substring(i,i+1));
            } else if(i<str.length()-1){
                strTmp = str.substring(i,str.length());
            }
            if(strTmp !=""){
                boolean matchNum = strTmp.matches(".*[0-9].*");    //숫자포함여부 확인
                boolean matchSpace = strTmp.matches(".*[^a-zA-Z0-9].*");   //공백,특수문자 포함여부 확인
                if(!matchNum && !matchSpace){
                    list.add(strTmp.toUpperCase());    //대문자로 통일
                }
            }
        }
        return list;
    }
    int union(List<String> list1, List<String> list2,List<String> tmpList) { //합집합 개수 구하기
        //List<String> tmpList = new ArrayList<>();
        
        //tmpList = intersection(list1,list2);
        //1.리스트 합치기
        List<String> list = new ArrayList<>(); 
        if(list1.size()>list2.size()){
            list = list1;
            for (String str : list2) {
                list.add(str);
            }
        } else {
            list = list2;
            for (String str : list1) {
                list.add(str);
            }
        }
        System.out.println"list union == "+list);
        //tmpList = intersection(list1,list2);
        //합친 리스트에서 교집합 빼기
        for(int i=0; i<tmpList.size(); i++){
            for(int j=0; j<list.size(); j++){
                if(tmpList.get(i).equals(list.get(j))){
                    list.remove(j);
                    break;
                }
            }
        }
        System.out.println"list intersection == "+tmpList);
        System.out.println"list union2 == "+list);
        //계산
        
        double union = 0.0;
        double intersection = 0.0;
        int result = 0;
        if(tmpList.size() ==0){
            intersection = 0.0;
        }else{
            intersection = (double)tmpList.size();
        }
        if(list.size() ==0){
            union = 0.0;
        }else{
            union = (double)list.size();
        }
        if(union ==0 && intersection==0){
            intersection = 1.0;
            union = 1.0;
        }
        System.out.println"intersection == "+intersection);
        System.out.println"union == "+union);
        double tmp = intersection/union;
        result = (int)(65536 * tmp);
        
        return result;
    }
    
    List<String> intersection(List<String> list_1, List<String> list_2) { //교집합 개수 구하기
        List<String> list = new ArrayList<>(); 
        if(list_1.size()>list_2.size()){
            for(int i=0; i<list_2.size(); i++){
                for(int j=0; j<list_1.size(); j++){
                    if(list_2.get(i).equals(list_1.get(j))){
                        list.add(list_1.get(j));
                        list_1.remove(j);
                        break;
                    }
                }
            }
        } else {
            for(int i=0; i<list_1.size(); i++){
                for(int j=0; j<list_2.size(); j++){
                    if(list_1.get(i).equals(list_2.get(j))){
                        list.add(list_2.get(j));
                        list_2.remove(j);
                        break;
                    }
                }
            }
        }
        return list;
    }
    
    public int solution(String str1, String str2) {
        int answer = 0;
        List<String> list_1 = new ArrayList<>();
        List<String> list_2 = new ArrayList<>();
        //1.각각의 문자열을 2개씩 끊어서 리스트로 만들기 - 공백,숫자.특수문자는 제외
        list_1 = makeList(str1);
        list_2 = makeList(str2);
        System.out.println"list_1 == "+list_1+ " "+ list_2);
        //2.구한 리스트로 교집합, 합집합 개수 구하기
        List<String> tmpList = new ArrayList<>();
        tmpList = intersection(makeList(str1),makeList(str2));
        answer = union(list_1,list_2,tmpList);
        System.out.println"answer == "+answer);
        return answer;
    }
}
cs

문자열을 체크하는 부분을 string matches와 정규표현식을 이용

사용법이 익숙하지 않아 찾아보는데 시간이 걸림

합집합 교집합 함수를 만들때 경우의수를 고려하는 과정이 까다로웠음

posted by 코딩 공부중 2022. 2. 8. 10:06

문제 설명

짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa 

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항
  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

입출력 예sresult
baabaa 1
cdcd 0
입출력 예 설명

입출력 예 #1
위의 예시와 같습니다.
입출력 예 #2
문자열이 남아있지만 짝지어 제거할 수 있는 문자열이 더 이상 존재하지 않기 때문에 0을 반환합니다.

※ 공지 - 2020년 6월 8일 테스트케이스가 추가되었습니다.

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
import java.util.*;
class Solution
{
    public int solution(String s)
    {
        int answer = -1;
        Stack<Character> stack = new Stack<>();
        for(int i=0; i<s.length(); i++){
            if(stack.size()!=0){    //스택 사이즈가 0이 아닐때
                if(stack.peek()==s.charAt(i)){
                    stack.pop();    //같으면 팝
                } else{
                   stack.push(s.charAt(i));    //문자열 값 넣어줌
                }
            }else{
                stack.push(s.charAt(i));    //문자열 값 넣어줌 
            }
        }
        int count =0;
        if(stack.size()==0){
            answer = 1;
        }else {
            answer =0;
        }
        // [실행] 버튼을 누르면 출력 값을 볼 수 있습니다.
        return answer;
    }
}
cs

스택을 쓰면 간단하게 해결

posted by 코딩 공부중 2022. 2. 8. 10:04

문제 설명

오픈채팅방

카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.

신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.

"[닉네임]님이 들어왔습니다."

채팅방에서 누군가 나가면 다음 메시지가 출력된다.

"[닉네임]님이 나갔습니다."

채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.

  • 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
  • 채팅방에서 닉네임을 변경한다.

닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다.

예를 들어, 채팅방에 "Muzi"와 "Prodo"라는 닉네임을 사용하는 사람이 순서대로 들어오면 채팅방에는 다음과 같이 메시지가 출력된다.

"Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."

채팅방에 있던 사람이 나가면 채팅방에는 다음과 같이 메시지가 남는다.

"Muzi님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Muzi님이 나갔습니다."

Muzi가 나간후 다시 들어올 때, Prodo 라는 닉네임으로 들어올 경우 기존에 채팅방에 남아있던 Muzi도 Prodo로 다음과 같이 변경된다.

"Prodo님이 들어왔습니다."
"Prodo님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

채팅방은 중복 닉네임을 허용하기 때문에, 현재 채팅방에는 Prodo라는 닉네임을 사용하는 사람이 두 명이 있다. 이제, 채팅방에 두 번째로 들어왔던 Prodo가 Ryan으로 닉네임을 변경하면 채팅방 메시지는 다음과 같이 변경된다.

"Prodo님이 들어왔습니다."
"Ryan님이 들어왔습니다."
"Prodo님이 나갔습니다."
"Prodo님이 들어왔습니다."

채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.

제한사항
  • record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
  • 다음은 record에 담긴 문자열에 대한 설명이다.
    • 모든 유저는 [유저 아이디]로 구분한다.
    • [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
    • [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
    • [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
    • 첫 단어는 Enter, Leave, Change 중 하나이다.
    • 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
    • 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
    • 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
    • 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.
입출력 예recordresult
["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"] ["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]
입출력 예 설명

입출력 예 #1
문제의 설명과 같다

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import java.util.Queue;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.LinkedHashMap;
class Solution {
    public String[] solution(String[] record) {
        List<String> list = new ArrayList();
        Queue<String> queue1 = new LinkedList();    //명령어
        Map<StringString> map3 = new LinkedHashMap<>(); //최종닉네임
        Queue<String> queue2 = new LinkedList();    //아이디
        Queue<String> queue3 = new LinkedList();    //닉네임
        
        //1.주어진 배열을 3개로 나누기(명령, 아이디, 닉네임)
        for(int i=0; i< record.length; i++){
            //공백 기준으로 값 가져오기
            String[] words = record[i].split("\\s");
            if(words.length ==3){
                queue1.offer(words[0]);
                queue2.offer(words[1]);
                queue3.offer(words[2]);
                map3.put(words[1],words[2]); 
            }else{
                queue1.offer(words[0]);
                queue2.offer(words[1]);
                queue3.offer("empty");
            }
        }
        String[] result = new String[queue1.size()];
        // System.out.println( "queue1 == "+queue1);
        // System.out.println( "queue2 == "+queue2);
        // System.out.println( "queue3 == "+queue3);
        // System.out.println( "map3 == "+map3);
        //2.for문 돌려서 명령에 따라 answer에 문자열 넣기
        int count = 0;
        while(!queue1.isEmpty()){
            if(queue1.peek().equals("Enter")){  // 삽입이면
                result[count] = queue2.poll()+"님이 들어왔습니다.";
                queue1.poll();
            }else if(queue1.peek().equals("Leave")){
                result[count] = queue2.poll()+"님이 나갔습니다.";
                queue1.poll();
            } else{
                queue1.poll();
                queue2.poll();
            }
            count++;
        }
        for(int i=0; i<result.length; i++){
            if(result[i] != null){
                int tmpIndex =result[i].indexOf("님");
                String tmp = result[i].substring(0,tmpIndex);
                list.add(result[i].replace(tmp, map3.get(tmp)));
            }
            //System.out.println( "result[i] == "+result[i]);
        }
        //3.명령어중에 change를 찾아서 그 번호에 해당하는 닉네임 answer에서 바꿔주기
        String[] answer = new String[list.size()];
        list.toArray(answer);
        
        
        // 끝
        
        
        return answer;
    }
}
cs

처음 문제의 조건을 꼼꼼하게 읽지 않아 잘못된 방식으로 문제를 풀고 있었음

 

posted by 코딩 공부중 2022. 2. 8. 10:01

문제 설명

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다.
간단한 예로 "aabbaccc"의 경우 "2a2ba3c"(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수 있는데, 이러한 방식은 반복되는 문자가 적은 경우 압축률이 낮다는 단점이 있습니다. 예를 들면, "abcabcdede"와 같은 문자열은 전혀 압축되지 않습니다. "어피치"는 이러한 단점을 해결하기 위해 문자열을 1개 이상의 단위로 잘라서 압축하여 더 짧은 문자열로 표현할 수 있는지 방법을 찾아보려고 합니다.

예를 들어, "ababcdcdababcdcd"의 경우 문자를 1개 단위로 자르면 전혀 압축되지 않지만, 2개 단위로 잘라서 압축한다면 "2ab2cd2ab2cd"로 표현할 수 있습니다. 다른 방법으로 8개 단위로 잘라서 압축한다면 "2ababcdcd"로 표현할 수 있으며, 이때가 가장 짧게 압축하여 표현할 수 있는 방법입니다.

다른 예로, "abcabcdede"와 같은 경우, 문자를 2개 단위로 잘라서 압축하면 "abcabc2de"가 되지만, 3개 단위로 자른다면 "2abcdede"가 되어 3개 단위가 가장 짧은 압축 방법이 됩니다. 이때 3개 단위로 자르고 마지막에 남는 문자열은 그대로 붙여주면 됩니다.

압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.

제한사항

  • s의 길이는 1 이상 1,000 이하입니다.
  • s는 알파벳 소문자로만 이루어져 있습니다.
입출력 예sresult
"aabbaccc" 7
"ababcdcdababcdcd" 9
"abcabcdede" 8
"abcabcabcabcdededededede" 14
"xababcdcdababcdcd" 17

입출력 예에 대한 설명

입출력 예 #1

문자열을 1개 단위로 잘라 압축했을 때 가장 짧습니다.

입출력 예 #2

문자열을 8개 단위로 잘라 압축했을 때 가장 짧습니다.

입출력 예 #3

문자열을 3개 단위로 잘라 압축했을 때 가장 짧습니다.

입출력 예 #4

문자열을 2개 단위로 자르면 "abcabcabcabc6de" 가 됩니다.
문자열을 3개 단위로 자르면 "4abcdededededede" 가 됩니다.
문자열을 4개 단위로 자르면 "abcabcabcabc3dede" 가 됩니다.
문자열을 6개 단위로 자를 경우 "2abcabc2dedede"가 되며, 이때의 길이가 14로 가장 짧습니다.

입출력 예 #5

문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다.
따라서 주어진 문자열을 x / ababcdcd / ababcdcd 로 자르는 것은 불가능 합니다.
이 경우 어떻게 문자열을 잘라도 압축되지 않으므로 가장 짧은 길이는 17이 됩니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Collections;
class Solution {
    static List<Integer> list = new ArrayList<>();
    
    void answer(String s, int subNum,int n, int limit){
        if(n==limit){
            return;
        }
        int tmpNum = n; //for문 안 비교를 위한 값
        String tmp = s.substring(subNum,tmpNum);   //잘라서 확인할 값
        Queue<String> queue1 = new LinkedList();
        int count = 0;
        for(int i=0; i<s.length(); i+=n){
            String result = s.substring(i,tmpNum);
            if(tmp.equals(result)){
                if(i !=0){
                    count++;
                }
            } else{
                if(count>=1){
                    queue1.offer(Integer.toString(count+1));
                    count = 0;
                }
                // split 함수에 공백문자를 지정
                String[] strArray = tmp.split("");
                for(String str : strArray) {
                    queue1.offer(str);
                }
                tmp = s.substring(i,tmpNum);
            }
            // System.out.println("i== "+i); 
            // System.out.println("s.length()== "+s.length());
            // System.out.println("tmpNum== "+tmpNum); 
            // System.out.println("tmpNum+n== "+(tmpNum+n));
            // System.out.println("count== "+count); 
            // System.out.println("tmp== "+tmp);
            // System.out.println("result== "+result);
            if(tmpNum+> s.length() && count !=0){
                queue1.offer(Integer.toString(count+1));
                
                if(tmpNum<s.length()){
                    result = s.substring(i, s.length());
                     String[] strArray = result.split("");
                    for(String str : strArray) {
                         queue1.offer(str);
                    }
                } else {
                    // split 함수에 공백문자를 지정
                    String[] strArray = tmp.split("");
                    for(String str : strArray) {
                        queue1.offer(str);
                    }
                    tmp = s.substring(i,tmpNum);
                }
                break;
            } else if(tmpNum+> s.length()){
                result = s.substring(i, s.length());
                String[] strArray = result.split("");
                for(String str : strArray) {
                     queue1.offer(str);
                }
                break;
            } else{
              tmpNum =tmpNum+n;
            }
        }
        
        int answer = 0;
        
     //  System.out.println("queue1 "+queue1); // 0
        while(!queue1.isEmpty()){
            String test = queue1.poll();
            if(test.length()<2){
                answer++;
            }else {
                answer = answer + test.length();
            }
        }
        list.add(answer);
        answer(s,0,n+1,limit);
    }
    public int solution(String s) {
        
        int answer = 0;
        if(s.length()>1){
            int limit = (s.length()/2)+1;
            answer(s,0,1,limit);
            answer = Collections.min(list);
        } else {
            answer = 1;
        }
       // System.out.println("list "+list); // 0
        return answer;
    }
}
cs

경우의수 계산하는데 시간이 많이 걸림

'java' 카테고리의 다른 글

[프로그래머스]짝지어 제거하기  (0) 2022.02.08
[프로그래머스]오픈채팅방  (0) 2022.02.08
[프로그래머스]H-index  (0) 2022.02.07
[프로그래머스]베스트앨범  (0) 2022.02.07
[프로그래머스]타겟넘버  (0) 2022.02.07
posted by 코딩 공부중 2022. 2. 7. 15:10

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

입출력 예

citationsreturn

[3, 0, 6, 1, 5] 3

입출력 예 설명

이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

※ 공지 - 2019년 2월 28일 테스트 케이스가 추가되었습니다.

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
32
33
34
35
36
37
38
39
40
41
42
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
 
class Solution {
    public int solution(int[] citations) {
        int[] tmp = new int[citations.length];
        int answer = 0;
        ArrayList<Integer> list = new ArrayList<>();
        Arrays.sort(citations);
        for (int i = 0; i < citations.length; i++) {
            tmp[tmp.length - i - 1]= citations[i];
        }
 
        for(int i=0; i<citations.length; i++) {
            int count = 0;
            if(count == citations[citations.length -1]) {
                break;
            }
            for(int j=0; j<citations.length; j++) {
                if(citations[i]>citations[j]) {
                    count++;
                }
            }
            list.add(count+1);
        }
       
        ArrayList<Integer> test = new ArrayList<>();
        for(int i=0; i<list.size(); i++) {
            if(list.get(i) == tmp[i] ) {
                 answer = list.get(i);
                 return answer;
             }else if(list.get(i) <tmp[i]) {
                 test.add(list.get(i));
             }
            int max = test.isEmpty() ? -1 : Collections.max(test);
                 answer = max;
        }
        return answer;
        
    }
}
cs

list만 써서 해결

'java' 카테고리의 다른 글

[프로그래머스]오픈채팅방  (0) 2022.02.08
[프로그래머스]문자열 압축  (0) 2022.02.08
[프로그래머스]베스트앨범  (0) 2022.02.07
[프로그래머스]타겟넘버  (0) 2022.02.07
[프로그래머스]구명보트  (0) 2022.02.07