K번째 큰 수 / 올바른 괄호

-·2023년 12월 27일
0

Inflearn-basicTest

목록 보기
18/27

K번째 큰 수

🗒️TreeSet

중복을 허용하지 않는다. 오름차순 정렬
set은 보통 중복제거를 위해 사용한다.

TreeSet<>(Collections.reverseOrder());

내림차순 정렬

ts.remove(value);

입력 value값을 삭제한다.

ts.size();

원소의 개수를 반환한다.

ts.first() / last();

첫/마지막 원소를 반환한다.
-내림차순이면 가장 큰 값 / 오름차순이면 가장 작은 값 반환. (last:반대)

✏️ 문제

* 설명
현수는 1부터 100사이의 자연수가 적힌 N장의 카드를 가지고 있습니다. 같은 숫자의 카드가 여러장 있을 수 있습니다.
현수는 이 중 3장을 뽑아 각 카드에 적힌 수를 합한 값을 기록하려고 합니다. 3장을 뽑을 수 있는 모든 경우를 기록합니다.
기록한 값 중 K번째로 큰 수를 출력하는 프로그램을 작성하세요.
만약 큰 수부터 만들어진 수가 25 25 23 23 22 20 19......이고 K값이 3이라면 K번째 큰 값은 22입니다.

* 입력
첫 줄에 자연수 N(3<=N<=100)과 K(1<=K<=50) 입력되고, 그 다음 줄에 N개의 카드값이 입력된다.

* 출력
첫 줄에 K번째 수를 출력합니다. K번째 수가 존재하지 않으면 -1를 출력합니다.

🔍풀이

TreeSet(Collections.reverseOrder()) 을 이용해 중복제거 + 내림차순으로 값을 넣어준 뒤, int index를 통해서 k번째 값을 출력한다.

public int solution(int n, int k, int[] arr){
	int answer = 0;
    TreeSet<Integer> Tmap = 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++){
				Tmap.add(arr[i]+arr[j]+arr[l];
			}
        }
    }
    int kth = 0;
    if(Tmap.size() < k) answer = -1;
    else{
    	for(int i : ts){
        	kth++; //0번째인덱스 ->1번째 큰 수
           	if(kth == k) answer = i;
        }
    }   
    return answer;
}

올바른 괄호

🗒️Stack

First In Frist Out 구조.
push와 pop, isEmpty가 주로 사용된다.

✏️ 문제

* 설명
괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다.
(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.

* 입력
첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.

* 출력
첫 번째 줄에 YES, NO를 출력한다.

🔍풀이

Stack을 이용해 우괄호와 좌괄호를 개수를 셈한다.

public String solution(String str) {
	String answer = "YES";
	Stack stack = new Stack<>();
   	for(char c : str.toCharArray()){
    	if(c == '(') stack.push(c);
        else{
        	if(stack.isEmpty()) return "NO";
            stack.pop();
        }
    }
    if(!stack.isEmpty()) return "NO";
    return answer;
}
profile
신입 개발자의 개인 공부 공간입니다

0개의 댓글