List<double[]> fail = new ArrayList<>(); // 선언
fail.add(new double[] {i,cnt/(double)whole}); // 값 추가
fail.sort((a,b) -> Double.compare(a[0], b[0])); // [0]기준으로 오름차순 정렬
fail.sort((a,b) -> Double.compare(b[1], a[1])); // [1]기준으로 내림차순 정렬
answer=fail.get(i)[0]; // i번째 원소의 첫번째 요소값 얻기
// ** 1차원 ArrayList일 때 **
// 오름차순으로 정렬
list.sort(Comparator.naturalOrder());
Collections.sort(list);
// 내림차순으로 정렬
list.sort(Comparator.reverseOrder());
Collections.sort(list,Collections.reverseOrder());
------------------------------------------------------------
// ** 2차원 + 두번째 요소 기준으로 정렬할 때 **
list.sort((a, b) -> Double.compare(a[1], b[1])); // 오름차순
list.sort((a, b) -> Double.compare(b[1], a[1])); // 내림차순
Collections.sort(list, ((a, b) -> Double.compare(a[1], b[1])));
Collections.sort(list, ((a, b) -> Double.compare(b[1], a[1])));
------------------------------------------------------------
// ** ArrayList Type이 Class 이고
// 객체의 특정 설정값을 기준으로 정렬할 떼 ** (실패율 코드 참고하기)
list.sort((a, b) -> Double.compare(a.idx, b.idx));
// 객체의 idx기준으로 오름차순 정렬
list.sort((a, b) -> Double.compare(b.idx, a.idx));
// 객체의 idx기준으로 내림차순 정렬
Arrays.sort(arr); // 배열 오름차순 정렬
Arrays.sort(arr, Collections.reverseOrder()); // 내림차순 정렬
Arrays.sort(arr, 0, 4); // 인덱스 0부터 4까지 부분정렬
: HashSet과 달리 값을 add할 때 정렬도 동시에 된다.
HashSet보다 검색,정렬 기능은 더 빠르나 추가,삭제 에는 시간이 더 걸림
검색의 경우 객체 전체를 대상으로 한 번씩 반복해서 가져오는 Iterator를 제공(HashSet에서도 제공함)
TreeSet<Integer> set1 = new TreeSet<Integer>(); //TreeSet생성
set.add(7); //값추가
set.remove(1); //값 1 제거
set.clear(); //모든 값 제거
System.out.println(set.size()); //크기 구하기
System.out.println(set.first()); //최소값 출력
System.out.println(set.last()); //최대값 출력
System.out.println(set.higher(3));
//입력값보다 큰 데이터중 최소값 출력, 없으면 null
System.out.println(set.lower(3));
//입력값보다 작은 데이터중 최대값 출력, 없으면 null
// 객체 전체 검색 시
Iterator iter = set.iterator();
while(iter.hasNext()) { //값이 있으면 true 없으면 false
System.out.println(iter.next());
// next()로 하나의 객체 가져오기
}
방법1) .toArray()
Integer[] answer = {};
answer = set.toArray(new Integer[0]);
//배열 크기를 0으로 지정하면 자동으로 배열의 크기가 지정됨
방법2) Iterator 활용
Integer[] answer = {};
Iterator<Integer> iter = set.iterator();
while(iter.hasNext()) {
answer.add(iter.next());
}
int n=3;
n/=1; // 몫 연산
n = n/2d; // 실수로 나누기 연산값 도출
n = (double)n/2;
n%=2; // 나머지 연산
int 혹은 double float 등 아무 타입이나 String과 + 하게 되면 무조건 String 타입으로 출력이 됨
System.out.print("3"+1); // 31 출력
String n="000";
n+=1; // 0001 출력
import java.util.*;
public class java0705_3 {
public int[] solution(int N, int[] stages) {
int whole = stages.length;
List<double[]> fail = new ArrayList<>();
int cnt=0;
//stage는 1부터 N + 1까지 있음, 실패율은 N까지만 구하기
for(int i=1;i<=N; i++)
{
// 각 스테이지의 사람수 구하기
for(int j=0;j<stages.length;j++) {
if(i==stages[j])
cnt++;
}
// {스테이지 번호, 실패율} 구하기
double fail_rate = 0;
fail_rate = (cnt==0) ? 0: cnt/(double)whole;
fail.add(new double[] {i,fail_rate});
// 나누는 수가 0이면 나누기 연산에서 에러가 나기에 미리 0할당
// 직접형변환(double) 꼭 해주기!
whole -= cnt;
cnt=0;
}
// (두번째 요소)실패울을 기준으로 내림착순 정렬
fail.sort((a,b) -> Double.compare(b[1], a[1]));
// 스테이지 번호 구하기
int[] answer = new int[N];
for(int i=0; i<fail.size();i++) answer[i]=(int)fail.get(i)[0];
return answer;
}
}
import java.util.*;
public class java0705_3 {
static class Fail{
int idx; // stage 번호
double rate; // 실패율
public Fail(int idx, double rate) {
this.idx = idx;
this.rate = rate;
}
}
public int[] solution(int N, int[] stages) {
int whole = stages.length;
int cnt=0;
//stage는 1부터 N + 1까지 있음, 실패율은 N까지만 구하기
ArrayList<Fail> fail = new ArrayList<>();
for(int i=1;i<=N; i++)
{
// 각 스테이지의 사람수 구하기
for(int j=0;j<stages.length;j++) {
if(i==stages[j])
cnt++;
}
// {스테이지 번호, 실패율} 구하기
double fail_rate = 0;
fail_rate = (cnt==0) ? 0: cnt/(double)whole;
fail.add(new Fail(i,fail_rate));
// 나누는 수가 0이면 나누기 연산에서 에러가 나기에 미리 0할당
// 직접형변환(double) 꼭 해주기!
whole -= cnt;
cnt=0;
}
// 실패울을 기준으로 내림착순 정렬
fail.sort((a,b) -> Double.compare(b.rate, a.rate));
// 스테이지 번호 구하기
int[] answer = new int[N];
for(int i=0; i<fail.size();i++) answer[i]=(int)fail.get(i).idx;
return answer;
}
public class java0706_2 {
public int solution(int[] d, int budget) {
int answer = 0;
Arrays.sort(d);
for(int i:d) {
budget-=i;
if(budget>=0) answer++;
else break;
}
return answer;
}
}
import java.util.Arrays;
public class Java0706_3 {
public int solution(int[] budgets, int M) {
int answer=0;
Arrays.sort(budgets);
int start = 0;
//int end = Arrays.stream(budgets).max().getAsInt(); // 시간초과
int end = budgets[budgets.length-1];
int mid = 0;
while (start <= end) {
mid = (start + end) / 2;
// 초기 상한액 = 최대 예산과 0의 중간값
for (int b : budgets) {
int x = 0;
x = (mid > b) ? b : mid;
// 상한액보다 작으면 b, 상한액보다 크면 answer
M -= x;
if (M < 0)
break;
}
if (M < 0)
end = mid+1;
else
start = mid-1;
answer = mid;
}
return answer;
}
}
public class Java0706_4 {
public TreeSet<Integer> set;
public void dfs(int[] arr,int depth,int start,int sum) {
if(depth==2) {
set.add(sum);
return;
}
for(int i=start; i<arr.length;i++)
dfs(arr,depth+1,i+1,sum+arr[i]);
}
public Integer[] solution(int[] numbers) {
Integer[] answer = {};
set = new TreeSet<>();
dfs(numbers,0,0,0);
answer = set.toArray(new Integer[0]);
// set -> array
// 이떄 배열 크기를 0으로 지정하면 자동으로 배열의 크기가 지정됨
return answer;
}
}
public class Java0706_5 {
public int solution(int n) {
String ans="";
while(n>0) {
ans += n%3; // 자동 문자열 변환
//ans+=Integer.toString(n%3); // 숫자를 문자열로
n/=3; // 몫 연산
}
return Integer.parseInt(ans,3); // 문자열 형태의 3진수를 십진수로 변환
}
}