코드 훔쳐보는 변태 코더
춤 좋아하는 백엔드 개발자(였으면 좋겠다)
분류 전체보기 (95)
23-01-02 TIL

오늘 진행한 것들 🤔

  • 알고리즘 3문제 풀이 (정렬,그리디)
 

백준 1946번 신입사원 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 256 MB 44813 14819 10815 32.065% 문제 언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1

codinghentai.tistory.com

 

백준 1431번 시리얼 번호 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 11139 6005 4941 55.133% 문제 다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는

codinghentai.tistory.com

 

백준 11497 통나무 건너뛰기 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 256 MB 6971 3993 3265 59.635% 문제 남규는 통나무를 세워 놓고 건너뛰기를 좋아한다. 그래서 N개의 통나무를 원형으로 세워 놓고 뛰어놀려고 한

codinghentai.tistory.com

  • 토이프로젝트 개발
    • 계정 엔티티 모델링 후 스프링 시큐리티 적용, 리액트 적용

 

오늘의 배운 점 🤔

  • 오랜만에 정렬 문제들을 다시 풀어보았습니다.
    • 전보다 정렬에 대한 이해도가 더 높아진것 같습니다.
    • 조금 더 신경쓰면 좋을것은 정렬을 직접 구현할 수 있는 문제가 나온다면 힘들어할것 같다는 생각이 들었습니다.
    • 단순히 comparator 를 이용한 정렬은 이제 어느정도 감이 익은것 같습니다.
  • 토이프로젝트를 진행했습니다.
    • 리액트를 처음으로 활용해보았습니다.
      • 전부터 배워보고싶었던 리액트를 사용해보았습니다.
      • 타임리프로 구현했던 뷰와 다르게 리액트를 활용하니 모든 상황에서 데이터를 파싱하여 사용해야하는구나 를 느끼게 되었습니다.
      • 하지만 제이쿼리와 타임리프를 활용해 구현했던것과 다르게 확실히 모듈화라는게 얼마나 좋은것인지 다시 한번 느끼게 되었습니다.
      • 프론트엔드를 객체지향방식처럼 짤 수 있으면 굉장히 효율적이겠다라는 생각을 했었는데 정말 머지않았구나.. 라는 생각이 듭니다.
    • 계정 로그인 관련 기능들을 구현했습니다.
      • 단순히 백엔드쪽에서 로그인을 할떄는 신경쓸게 없었는데, 프론트와 백을 완전히 분리시켜버리니 로그인을 어떻게 해야할까에 대한 고민이 생겼습니다.
      • 이전에 쿠키에 JWT토큰을 저장하는 방식으로 로그인을 구현했었는데, 이번에도 고민을 해봐야할것같습니다.

오늘은 적을게 별로 없으니 코딩 시간 인증

'TIL' 카테고리의 다른 글

23-01-05 TIL  (0) 2023.01.05
23-01-04 TIL  (0) 2023.01.05
22-12-29 TIL  (0) 2022.12.29
22-12-28 TIL  (0) 2022.12.28
22-12-26 TIL  (0) 2022.12.26
  Comments,     Trackbacks
백준 11497 통나무 건너뛰기 (자바) 풀이
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 256 MB 6971 3993 3265 59.635%

문제

남규는 통나무를 세워 놓고 건너뛰기를 좋아한다. 그래서 N개의 통나무를 원형으로 세워 놓고 뛰어놀려고 한다. 남규는 원형으로 인접한 옆 통나무로 건너뛰는데, 이때 각 인접한 통나무의 높이 차가 최소가 되게 하려 한다.

통나무 건너뛰기의 난이도는 인접한 두 통나무 간의 높이의 차의 최댓값으로 결정된다. 높이가 {2, 4, 5, 7, 9}인 통나무들을 세우려 한다고 가정하자. 이를 [2, 9, 7, 4, 5]의 순서로 세웠다면, 가장 첫 통나무와 가장 마지막 통나무 역시 인접해 있다. 즉, 높이가 2인 것과 높이가 5인 것도 서로 인접해 있다. 배열 [2, 9, 7, 4, 5]의 난이도는 |2-9| = 7이다. 우리는 더 나은 배열 [2, 5, 9, 7, 4]를 만들 수 있으며 이 배열의 난이도는 |5-9| = 4이다. 이 배열보다 난이도가 낮은 배열은 만들 수 없으므로 이 배열이 남규가 찾는 답이 된다.

입력

입력은 T개의 테스트 케이스로 이루어져 있다. 첫 줄에 T가 주어진다.

이어지는 각 줄마다 첫 줄에 통나무의 개수를 나타내는 정수 N(5 ≤ N ≤ 10,000), 둘째 줄에 각 통나무의 높이를 나타내는 정수 Li가 주어진다. (1 ≤ Li ≤ 100,000)

출력

각 테스트 케이스마다 한 줄에 주어진 통나무들로 만들 수 있는 최소 난이도를 출력하시오.

예제 입력 1 복사

3
7
13 10 12 11 10 11 12
5
2 4 5 7 9
8
6 6 6 6 6 6 6 6

예제 출력 1 복사

1
4
0

풀이

문제를 읽다보면 힌트가 나와있다.

2 4 5 7 9 로 입력받을때

2 5 9 7 4 에서 9-5 를 해서 난이도가 4가 나온다고 굉장히 친절하게 알려주고있다.

단순히 이것을 응용해서 입력받은 배열을 가장 큰 수가 중앙에 오고 그 다음으로 큰수가 중앙의 오른쪽, 그다음으로 큰수가 왼쪽으로 오게 만들면된다.

 

우선순위 큐를 활용해서 가장 큰 순서대로 정렬받은 배열을 먼저 만들고,

 

새로 정렬할 배열을 생성해준 후 왼쪽과 오른쪽 인덱스를 만들어주고 while 문으로 2개씩 poll해서 삽입해주면 된다.

그러면 배열의 순서상으론 맨 처음값과 맨 끝 값이 원래의 오름차순으로 데이터가 들어가있을건데,

 

이 두개를 뺀 값의 절대값을 max 변수에 대입해주고 배열을 처음부터 비교해서 더 큰 값이 나온다면 max를 바꿔주는 식으로 풀이하면 된다. (통나무 높이를 뺐을때 가장 큰 값이 난이도가 된다고 문제에 나와있다.)

 

package baekjoon.a11497;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class a11497 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for(int i=0; i<T;i++){
            int N = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine());
            PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2-o1);
            int[] arr = new int[N];
            for(int j=0; j<N;j++){
                queue.add(Integer.valueOf(st.nextToken()));
            }
            arr[N/2]=queue.poll();
            int left = N/2-1;
            int right = N/2+1;
            while(!queue.isEmpty()){
                if(right<N){
                arr[right++]=queue.poll();}
                if(!queue.isEmpty()){
                arr[left--]=queue.poll();}
            }
            int max = Math.abs(arr[0]-arr[N-1]);
            for(int j=1; j<N;j++){
               max = Math.max(max,Math.abs(arr[j]-arr[j-1]));
            }
            System.out.println(max);
        }
    }

}

 

 

 

  Comments,     Trackbacks
백준 1431번 시리얼 번호 (자바) 풀이
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 11139 6005 4941 55.133%

문제

다솜이는 기타를 많이 가지고 있다. 그리고 각각의 기타는 모두 다른 시리얼 번호를 가지고 있다. 다솜이는 기타를 빨리 찾아서 빨리 사람들에게 연주해주기 위해서 기타를 시리얼 번호 순서대로 정렬하고자 한다.

모든 시리얼 번호는 알파벳 대문자 (A-Z)와 숫자 (0-9)로 이루어져 있다.

시리얼번호 A가 시리얼번호 B의 앞에 오는 경우는 다음과 같다.

  1. A와 B의 길이가 다르면, 짧은 것이 먼저 온다.
  2. 만약 서로 길이가 같다면, A의 모든 자리수의 합과 B의 모든 자리수의 합을 비교해서 작은 합을 가지는 것이 먼저온다. (숫자인 것만 더한다)
  3. 만약 1,2번 둘 조건으로도 비교할 수 없으면, 사전순으로 비교한다. 숫자가 알파벳보다 사전순으로 작다.

시리얼이 주어졌을 때, 정렬해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 기타의 개수 N이 주어진다. N은 50보다 작거나 같다. 둘째 줄부터 N개의 줄에 시리얼 번호가 하나씩 주어진다. 시리얼 번호의 길이는 최대 50이고, 알파벳 대문자 또는 숫자로만 이루어져 있다. 시리얼 번호는 중복되지 않는다.

출력

첫째 줄부터 차례대로 N개의 줄에 한줄에 하나씩 시리얼 번호를 정렬한 결과를 출력한다.

예제 입력 1 복사

5
ABCD
145C
A
A910
Z321

예제 출력 1 복사

A
ABCD
Z321
145C
A910

예제 입력 2 복사

2
Z19
Z20

예제 출력 2 복사

Z20
Z19

예제 입력 3 복사

4
34H2BJS6N
PIM12MD7RCOLWW09
PYF1J14TF
FIPJOTEA5

예제 출력 3 복사

FIPJOTEA5
PYF1J14TF
34H2BJS6N
PIM12MD7RCOLWW09

예제 입력 4 복사

5
ABCDE
BCDEF
ABCDA
BAAAA
ACAAA

예제 출력 4 복사

ABCDA
ABCDE
ACAAA
BAAAA
BCDEF

 

 

풀이

 

굉장히 친절한 문제이다

 

문제에 어떻게 정렬을 하라고 다 알려주고 있다.

 

1 -> A와 B의 길이가 다르다면 짧은것이 먼저 온다.

단순히 조건문으로 A와 B의 길이를 비교해 정렬하면 된다.

2 -> A와 B의 길이가 같다면 문자열 내 모든 숫자의 합 순으로 정렬한다.

마찬가지로 조건문안에 반복문을 삽입하면 된다.

3 -> 두 방법으로도 정렬이 안된다면 단순 사전순으로 정렬한다.

 

3번째 방법이 문제이다.

두 방법으로도 정렬이 안된다면? 이 어떤 상황일까?

단순하다. A와 B의 길이도 같은데 문자열 내 모든 숫자의 합마저 같다면 이라는 조건이 되어버린다.

 

단순히 2번의 조건문 안에 숫자의 합을 비교하는 조건문을 추가해주면 된다.

 

package baekjoon.a1431;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class a1431 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<String> list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            list.add(br.readLine());
        }
        list.sort((o1, o2) -> {
            if (o1.length() != o2.length()) {
                return o1.length() - o2.length();
            } else {
                int a = 0;
                int b = 0;
                for (int i = 0; i < o1.length(); i++) {
                    int num1 = o1.charAt(i) - '0';
                    int num2 = o2.charAt(i) - '0';
                    if (num1 > 0 && num1 < 10) {
                        a += num1;
                    }
                    if (num2 > 0 && num2 < 10) {
                        b += num2;
                    }
                }
                if (a == b) {
                    return o1.compareToIgnoreCase(o2);
                }
                return a - b;
            }
        });
        list.forEach(System.out::println);
    }
}

  Comments,     Trackbacks
백준 1946번 신입사원 (자바) 풀이
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 256 MB 44813 14819 10815 32.065%

문제

언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다.

그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다.

이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성적, 면접 성적의 순위가 공백을 사이에 두고 한 줄에 주어진다. 두 성적 순위는 모두 1위부터 N위까지 동석차 없이 결정된다고 가정한다.

출력

각 테스트 케이스에 대해서 진영 주식회사가 선발할 수 있는 신입사원의 최대 인원수를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

2
5
3 2
1 4
4 1
2 3
5 5
7
3 6
7 3
4 2
1 4
5 7
2 5
6 1

 

풀이

해당 문제는 정렬과 그리디 알고리즘을 활용한 문제이다.

그리디 알고리즘은 배우지 않았지만 대충 탐욕 이라는 뜻을 가진다는걸 알고있기는 하다..

 

단순하다. 문제의 조건 자체가 다른 지원자보다 하나라도 점수가 낮다면 탈락이 되고, 최대의 합격자수를 가져와주길 바라고 있다.

 

최대 를 가지려면 일단 생각해봐야 할것이 남들보다 두 점수 모두가 높은 사람들을 탈락시키고 적절한 비율로 합격을 시킬것인지, 아닌지 를 생각해보면 좋다.

 

하지만 문제 자체는 정렬을 이용해 풀라고 알려주고 있다.

 

단순히 배열에 값을 입력받아서 서류심사 성적 순으로 정렬하고, 첫번째 지원자의 면접심사 점수보다 낮은 사람이 존재한다면 낮은 사람의 점수를 기억한후 카운트를 ++ 하는식으로 돌리면 된다.

 

package baekjoon.a1946;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class a1946 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for (int i = 0; i < T; i++) {
            List<int[]> list = new ArrayList<>();
            int N = Integer.parseInt(br.readLine());
            for (int j = 0; j < N; j++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                list.add(new int[]{Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())});
            }
            list.sort(Comparator.comparingInt(o -> o[0]));
            int count =1;
             int min = list.get(0)[1];
             for(int k=1; k<list.size();k++){
                 if(min>list.get(k)[1]){
                     min = list.get(k)[1];
                     count++;
                 }
             }
            System.out.println(count);
        }
    }
}

 

가장 일반적인 풀이방법이라 생각한다.

 

 

  Comments,     Trackbacks
22-12-30 TIL

오늘 진행한 것들 🤔

  • 토이프로젝트 설계
    • 외부 API를 활용한 커뮤니티 서비스를 클론코딩 하기로 맘을 먹었다.

  • 알고리즘 문제풀이
    • 동적 계획법, 해시테이블, 깊이우선탐색 (?) 프로그래머스 / 백준 문제풀이
 

프로그래머스 마법의 엘리베이터 (자바) 풀이

문제 설명 마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특별합니다.

codinghentai.tistory.com

 

 

프로그래머스 귤 고르기 (자바) 풀이

문제 설명 경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한

codinghentai.tistory.com

오늘의 배운 점 🤔

  • 토이프로젝트를 설계했습니다.
    • 추억을 살려서 어렸을때 많이 플레이 했었던 던전앤 파이터의 API를 활용한 프로젝트를 진행해보기로 했습니다.
    • ERD를 설계하는데 왜이렇게 테이블이 적지,, 라고 생각했던 순간 외부 API를 쓰기때문에라는 생각이 스쳐지나갔습니다....
    • 이미 만들어져있는걸 얼마나 잘 활용하느냐도 능력이라고 생각하기때문에.. 어떻게 잘 찜쪄먹을지를 많이 고민해봐야겠습니다.
    • 요즘 헤이해지고있다고 생각했었는데 새로운 시작이라고 느껴집니다.
  • 알고리즘 문제풀이
    • 동적계획법 문제를 풀이했습니다.
      • 동적계획법은 풀어도 풀어도 어떠한 조건을 설정해서 풀어나가야할지가 가장 큰 고민거리인것 같습니다..
      • 이번에도 다른 유형의 문제를 맞닥트렸을때 매번 어떻게 조건을 설정할지를 못정해서 틀리기 일수였습니다.
      • 문제를 풀때 마음을 급하게 먹지 말아야하는데.. 그게 잘안되는것 같습니다 ㅜ.ㅠ
    • 프로그래머스 2레벨 문제를 풀이했습니다.
      • 처음으로 2레벨 문제들을 풀이를 안보고 풀어보았습니다..
      • 확실히 실력이 늘고있긴 한가봅니다.
      • 마찬가지로 여러 유형중에 학습하지 못했던 알고리즘문제들은 도전조차 못해보는게 아까웠습니다.
      • 이제 새로 프로젝트도 시작했으니 진짜 하루에 2문제만 풀어보아야겠습니다.
  Comments,     Trackbacks
프로그래머스 마법의 엘리베이터 (자바) 풀이

문제 설명

마법의 세계에 사는 민수는 아주 높은 탑에 살고 있습니다. 탑이 너무 높아서 걸어 다니기 힘든 민수는 마법의 엘리베이터를 만들었습니다. 마법의 엘리베이터의 버튼은 특별합니다. 마법의 엘리베이터에는 -1, +1, -10, +10, -100, +100 등과 같이 절댓값이 10c (c ≥ 0 인 정수) 형태인 정수들이 적힌 버튼이 있습니다. 마법의 엘리베이터의 버튼을 누르면 현재 층 수에 버튼에 적혀 있는 값을 더한 층으로 이동하게 됩니다. 단, 엘리베이터가 위치해 있는 층과 버튼의 값을 더한 결과가 0보다 작으면 엘리베이터는 움직이지 않습니다. 민수의 세계에서는 0층이 가장 아래층이며 엘리베이터는 현재 민수가 있는 층에 있습니다.

마법의 엘리베이터를 움직이기 위해서 버튼 한 번당 마법의 돌 한 개를 사용하게 됩니다.예를 들어, 16층에 있는 민수가 0층으로 가려면 -1이 적힌 버튼을 6번, -10이 적힌 버튼을 1번 눌러 마법의 돌 7개를 소모하여 0층으로 갈 수 있습니다. 하지만, +1이 적힌 버튼을 4번, -10이 적힌 버튼 2번을 누르면 마법의 돌 6개를 소모하여 0층으로 갈 수 있습니다.

마법의 돌을 아끼기 위해 민수는 항상 최소한의 버튼을 눌러서 이동하려고 합니다. 민수가 어떤 층에서 엘리베이터를 타고 0층으로 내려가는데 필요한 마법의 돌의 최소 개수를 알고 싶습니다. 민수와 마법의 엘리베이터가 있는 층을 나타내는 정수 storey 가 주어졌을 때, 0층으로 가기 위해 필요한 마법의 돌의 최소값을 return 하도록 solution 함수를 완성하세요.


제한사항
  • 1 ≤ storey ≤ 100,000,000

입출력 예storeyresult
16 6
2554 16

입출력 예 설명

입출력 예 #1

  • 문제 예시와 같습니다.

입출력 예 #2

  • -1, +100이 적힌 버튼을 4번, +10이 적힌 버튼을 5번, -1000이 적힌 버튼을 3번 누르면 0층에 도착 할 수 있습니다. 그러므로 16을 return 합니다.

 

풀이

해당 문제는 반례가 존재한다.

만약에 수가 555, 85 같은 경우에

일반적이라면 85-5, 80+20, 100-100

해서 8번이 걸릴수도 있겠다고 생각할 수 있지만

85+5,90+10,100-100 을 하면 7번인것처럼 예외도 생각해주어야한다.

 

따라서 조건문으로 해당 자릿수가 첫번째 자리가 아니고 해당 자리수의 숫자가 5이고 그 이전 자릿수의 숫자가 5보다 크거나 같다면 뺴주는게 아니라 숫자를 더해주는게 나을것이다.

 

    public static int solution(int storey) {
        int answer = 0;
        List<Integer> arr = Arrays.stream(String.valueOf(storey).split("")).map(Integer::parseInt).collect(Collectors.toList());
        int len = String.valueOf(storey).length();
        for (int i = len - 1; 0 <= i; i--) {
            int a = arr.get(i);
            if (5 < a) {
                if (i > 0) {
                    answer += 10 - a;
                    arr.set(i - 1, arr.get(i - 1) + 1);
                } else {
                    answer += 11 - a;
                }
            } else if (i > 0 && a == 5 && arr.get(i - 1) >= 5) {
                answer += 5;
                arr.set(i - 1, arr.get(i - 1) + 1);
            } else {
                answer += a;
            }
        }
        return answer;
    }

 

 

  Comments,     Trackbacks
프로그래머스 귤 고르기 (자바) 풀이

문제 설명

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.


제한사항
  • 1 ≤ k  tangerine의 길이 ≤ 100,000
  • 1 ≤ tangerine의 원소 ≤ 10,000,000

입출력 예ktangerineresult
6 [1, 3, 2, 5, 4, 5, 2, 3] 3
4 [1, 3, 2, 5, 4, 5, 2, 3] 2
2 [1, 1, 1, 1, 2, 2, 2, 3] 1

입출력 예 설명

입출력 예 #1

  • 본문에서 설명한 예시입니다.

입출력 예 #2

  • 경화는 크기가 2인 귤 2개와 3인 귤 2개 또는 2인 귤 2개와 5인 귤 2개 또는 3인 귤 2개와 5인 귤 2개로 귤을 판매할 수 있습니다. 이때의 크기 종류는 2가지로 이 값이 최소가 됩니다.

입출력 예 #3

  • 경화는 크기가 1인 귤 2개를 판매하거나 2인 귤 2개를 판매할 수 있습니다. 이때의 크기 종류는 1가지로, 이 값이 최소가 됩니다.

풀이

해당 문제는 단순히 정렬을 이용해 풀이하면 된다.

귤의 갯수를 따로 저장하고 갯수별로 정렬을 한 뒤에 같은 크기의 귤의 갯수가 k 보다 크거나 같으면 answer 을 ++ 하여 리턴하고

작다면 k에서 귤의 갯수만큼 뺀 후 다음 크기의 갯수를 비교하면 된다. 

 

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Solution {
    public static int solution(int k,int[] t){
        int answer=0;
       HashMap<Integer,Integer> map = new HashMap<>();
       for(int i=0;i<t.length; i++){
           map.put(t[i],map.getOrDefault(t[i],0)+1);
       }
       List<Map.Entry<Integer,Integer>> list = map.entrySet().stream().sorted(((o1, o2) -> o2.getValue()-o1.getValue())).collect(Collectors.toList());
       for(Map.Entry<Integer,Integer> key : list){
           if(k<=key.getValue()){
               answer++;
               return answer;
           }else{
                k-= key.getValue();
                answer++;
           }
       }return answer;
    }
}

 

  Comments,     Trackbacks
22-12-29 TIL

오늘 진행한 것들 🤔

  • 알고리즘 풀데이
 

백준 11726번 2xn 타일링 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 256 MB 128307 48836 36026 35.916% 문제 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2

codinghentai.tistory.com

 

 

백준 9095번 1,2,3 더하기 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 (추가 시간 없음) 512 MB 91254 59805 40667 63.913% 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이

codinghentai.tistory.com

 

 

백준 2156번 포도주 시식 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 111806 38034 27406 32.620% 문제 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬

codinghentai.tistory.com

 

 

백준 2579번 계단오르기 (자바) 풀이

시간 제한메모리 제한제출정답맞힌 사람정답 비율 1 초 128 MB 140615 47946 34657 33.776% 문제 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각

codinghentai.tistory.com

 

 

백준 11727번 2xn 타일링 2 (자바) 풀이

문제 2×n 직사각형을 1×2, 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)

codinghentai.tistory.com

등 몇문제

 

오늘의 배운 점 🤔

  • 오늘은 알게모르게 알고리즘 문제가 풀고싶어서 풀데이로 진행해보았습니다.
  • 동적계획법과 분할정복을 활용해 문제풀이를 진행했습니다.
  • 오늘의 수확은 그래도 어제보다 동적계획법을 활용하는법을 익힌것 같다는 것입니다.
    • 동적계획법 문제는 대부분 일정한 패턴으로 반복되는 문제가 많았습니다. 
    • 단순히 하루이틀전까지만 해도 문제를 계속 쳐다봐도 이해가 되지 않았는데 오늘은 풀이를 안보고 제출한 문제도 있어서 뿌듯했습니다.
    • 하지만 안풀린 문제들도 많았습니다. 제출까지 했으나 정리조차도 이해가 안가서 올리지 못한 문제들이 존재합니다.
    • 확실히 풀데이는 잘풀릴때는 괜찮지만 안풀리는 문제가 생기기 시작하면 그떄부터 멘탈이 흔들리는것 같습니다.
    • 내일부터는 절대 이렇게 하지 않고 두문제 이상 풀이하지 않으리라.. 다짐을 하게 됐습니다

 

목표를 지키지 않으니 세우지 않겠습니다.. 🫠

'TIL' 카테고리의 다른 글

23-01-04 TIL  (0) 2023.01.05
23-01-02 TIL  (0) 2023.01.02
22-12-28 TIL  (0) 2022.12.28
22-12-26 TIL  (0) 2022.12.26
22-12-22 TIL  (0) 2022.12.22
  Comments,     Trackbacks