백준 문제 풀이

10250번, 2910번(해시 맵), 4949번(스택)

qazwsxedc9 2022. 7. 25. 15:12

10250번

 

 

나머지와 몫을 활용하는 문제로 나머지가 0이 될 때만 주의해주면 된다

 

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

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i<test; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine()," ");
            int h = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());
            int n = Integer.parseInt(st.nextToken());
            String hotel;
            if(n%h ==0) { // 나머지가 0이 될 때 손님은 h층 방을 배정 받아야 한다
                hotel = h  + String.format("%02d", (n/h));
            } else {
                hotel = n%h  + String.format("%02d", (n/h)+1);
            }
           sb.append(hotel+"\n");
        }
        System.out.println(sb);
    }
}

 

2910번

 

 

LinkedHashMap을 사용하면 입력된 순서대로 데이터를 관리할 수 있다

수열의 숫자들을 key로 하고 해당 숫자들의 빈도수를 value로 한다

comparator를 구현하여 빈도수를 내림차순으로 정렬

key 값을 for문을 이용하여 value번 반복하여 출력한다

 

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

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int n = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine(), " ");
        Map<Integer,Integer> map = new LinkedHashMap<>();
        for(int i = 0; i<n; i++) {
            int num = Integer.parseInt(st.nextToken());
            if(map.containsKey(num)) {
                map.put(num, map.get(num)+1);
            } else {
                map.put(num,1);
            }
        }
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {
            @Override
            public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                return o2.getValue()-o1.getValue(); // 내림차순 정렬
            }
        });
        for(int i = 0; i<map.size(); i++) {
            for(int j = 0; j<list.get(i).getValue(); j++) {
                sb.append(list.get(i).getKey()+" ");
            }
        }
        System.out.println(sb);
    }
}

 

4949번

 

스택을 사용하는 문제로 예전에 푼 괄호 문제를 좀 더 응용한 거 같다

 

 

괄호가 아닌 문자의 경우 무시

괄호 문자인지 판단하고 괄호가 아닌 문자의 경우 무시

여는 괄호인지, 닫는 괄호인지를 판단하며, 닫는 괄호 일 경우 "]" 의 경우는 "[" 과 매칭되어야 하고, ")" 의 경우는 "(" 과 매칭

 

괄호의 짝을 맞춰야 한다는 것이 제일 중요하다!!

 

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

public class Practice {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while(true) {
            String str = br.readLine();
            String [] str1  = str.split("");
            Stack <String> st = new Stack<>();
            boolean check = true;
            if(str.equals(".")) {
                break;
            }
            for(int i = 0; i<str1.length; i++) {
                if(str1[i].equals("(") || str1[i].equals("[")) {
                    st.push(str1[i]); // 여는 괄호면 스택에 저장
                } else if(str1[i].equals(")")) { // 닫는 괄호 ")"일 때 조건이 필요
                    if(!st.empty() && st.peek().equals("(")) {
                        st.pop(); // "("과 괄호의 짝이 맞는 ")"만 pop 가능하게 함
                    } else {  // 스택이 비어있거나 pop 할 원소가 소괄호랑 매칭이 안되는 경우
                        check = false;
                        break;
                    }
                } else if(str1[i].equals("]")) { // 닫는 괄호 "]"일 때 조건이 필요
                    if(!st.empty() && st.peek().equals("[")) {
                        st.pop(); // "["과 괄호의 짝이 맞는 "]"만 pop 가능하게 함
                    } else { // 스택이 비어있거나 pop 할 원소가 소괄호랑 매칭이 안되는 경우
                        check = false;
                        break;
                    }
                }
            }
            if(!st.empty() || !check) {
               System.out.println("no");
            } else {
               System.out.println("yes");
            }
        }
    }
}