Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스택
- 투포인터알고리즘
- 코드스테이츠 백엔드
- 인텔리제이
- List.of
- Array.asList
- 코드스테이츠
- String.valueOf()
- 성능테스트툴
- 싱글톤패턴
- Spring MVC 동작원리
- MySQL
- 구간합구하기
- 자바
- 백준
- 클라우드에서 도커 실행하기
- 11659
- 재귀와반복문
- vm인스턴스생성
- 알고리즘
- GCP
- 프로그래머스
- 코딩테스트
- java
- Spring Web MVC
- 백준 11659
- OOP
- 버블정렬
- Spring MVC 구성요소
- 재귀함수
Archives
- Today
- Total
순간을 기록으로
[JAVA] K번째큰수 본문
문제
풀이
카드 3개의 합을 중에서 K번째로 높은 값을 구해야하는 문제이다. 우선 여러 카드 중에서 3개의 카드를 뽑는 건 3중 For문을 사용해서 할 수 있다. 그리고 그렇게 3개의 카드를 더한 값을 저장해야한다. 하지만 문제가 있는데 이렇게 뽑은 값들에 중복이 있다. 따라서 중복을 제거하기 위해 Set 자료구조를 사용할 것이다. 그리고 k번째로 높은 합을 구할거니깐 TreeSet을 사용한다. TreeSet은 안의 원소가 오름차순으로 정렬되어있다.
코드
package 인프런.해시맵과트리셋.K번째큰수.방법1;
import java.util.Collections;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
private int solution(int n, int m, int[] arr) {
int answer = -1; // 만약 k번째 수가 존재하지 않으면 -1
TreeSet<Integer> set = new TreeSet<>(Collections.reverseOrder()); // 내림차순 중복제거
for (int i=0; i<n; i++) {
for (int j=i+1; j<n; j++) {
for (int l=j+1; l<n; l++) {
set.add(arr[i] + arr[j] + arr[l]);
}
}
}
int index = 0; // 원소 순서를 추적하기 위한 변수
for (int x : set) {
index++;
if (index == m) return x;
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int[] arr = new int[N];
int M = in.nextInt();
for (int i=0; i<N; i++) {
arr[i] = in.nextInt();
}
System.out.println(T.solution(N, M, arr));
}
}
느낀점
Set에대한 특징을 알 수 있었던 문제. Set은 원소값이 중복되는것을 허용하지 않는다. 그리고 TreeSet의 경우 원소는 정렬상태에 있다.
만약 내림차수으로 바꾸고 싶으면 생성자에 Collections.reverseOrder()을 넣어주면 된다.
'Problem Solving' 카테고리의 다른 글
[JAVA] 신규 아이디 추천 (0) | 2022.01.12 |
---|---|
[JAVA] 쇠막대기 (0) | 2022.01.11 |
[JAVA] 연속 부분수열 (0) | 2022.01.11 |
[JAVA] 피보나치 수열 (0) | 2022.01.10 |
[JAVA] Least Recently Used, LRU 문제풀이 (0) | 2022.01.10 |
Comments