프로그래머스 lv1 0706

HyeJi9908·2022년 7월 6일
0

[JAVA] 프로그래머스

목록 보기
6/11

🔎 개념

2차원 ArrayList 선언 및 정렬

        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번째 원소의 첫번째 요소값 얻기
  • ArrayList 정렬
		// ** 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까지 부분정렬

TreeSet

: 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()로 하나의 객체 가져오기
}

Set을 배열로 변환

방법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 출력 

📚 실패율

방법1) 2차원 ArrayList<double[]> 를 사용해서 각 {스테이지 번호, 그 스테이지의 실패율} 저장

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;
    }

}

방법2) class 생성하여 class멤버 변수로 스테이지 번호, 실패율 할당

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;
    }

📚 예산(lv1)

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;
    }
}

📚 예산(lv3) - 이분 탐색

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;
	}
}

📚 두 개 뽑아서 더하기 - DFS, TreeSet

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;
    }
}

📚 3진법 뒤집기

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진수를 십진수로 변환 
    }
}

0개의 댓글