백준-10250,4949,2910번

문딤·2022년 7월 25일
0

ACM 호텔

https://www.acmicpc.net/problem/10250

문제 방향성

  1. 층 , 호수를 만들면 된다.
  2. 숫자 3개를 받아서 잘 조합해보자.

소스 코드

풀이 방법
1. 층수는 나머지로 앞에 붙이고,
2. 호수는 무조건 앞에 0 이 붙게해서 402이런식으로 만들어 준다.

알아 볼 것

참고

==============================================================================================

균형잡힌 세상

https://www.acmicpc.net/problem/4949


문제 방향성

  1. 문자와 특수문자가 섞여있는데 , 특수 문자만 받아서 PUSH
  2. 해당하는 조건이 있을 때 POP을 시켜주고.
  3. STACK 사이즈가 0보다 클때 NO

소스 코드


    public static String solve(String s) {

        Stack<Character> stack = new Stack<>();

        for(int i = 0; i < s.length(); i++) {

            char c = s.charAt(i);	// i 번째 문자

            // 여는 괄호일 경우 스택에 push
            if(c == '(' || c == '[') {
                stack.push(c);
            }

            // 닫는 소괄호 일 경우
            else if(c == ')') {

       
                if(stack.empty() || stack.peek() != '(') {
                    return "no";
                }
                else {
                    stack.pop();
                }
            }

            else if(c == ']') {

               
                if(stack.empty() || stack.peek() != '[') {
                    return "no";
                }
                else {
                    stack.pop();
                }
            }

            // 그 외의 경우에는 불필요한 문자들이기에 skip한다.
        }

        if(stack.empty()) {
            return "yes";
        }
        else {
            return "no";
        }
    }
}
public class Main {

public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringBuilder sb = new StringBuilder();

    String s;

    while(true) {

        s = br.readLine();

        if(s.equals(".")) {	// 종료 조건문
            break;
        }

        sb.append(solve(s)).append('\n');
    }

    System.out.println(sb);


}

문제 풀이

  1. 괄호만 받아서 PUSH POP을 해줘서 판단.
  2. 마침표가 눌리면 바로 break;
  3. while 문 안에서 원하는만큼 돌리게하는데 시간이 걸림.

알아 볼 것

StringTokenize, 스택, 데큐

참고

==============================================================================================

빈도 정렬

https://www.acmicpc.net/problem/2910

문제 방향성
1. 두 수에서 많이 등장하는 빈도
2. 먼저 배열에 들어와 있었는지로 판단.

소스 코드

public static void main(String[] args) throws IOException {
    
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st1 = new StringTokenizer(br.readLine());
    StringBuilder sb = new StringBuilder();
    int n = Integer.parseInt(st1.nextToken());


    StringTokenizer st2 = new StringTokenizer(br.readLine());
    HashMap<Integer, int[]> map = new HashMap<>(n); // 0은 개수, 1은 인덱스
    int idx = 0;
    while (st2.hasMoreTokens()){
        int in = Integer.parseInt(st2.nextToken());
        if (map.containsKey(in))
            map.put(in, new int[]{map.get(in)[0]+1, map.get(in)[1]});
        else map.put(in, new int[]{1, idx++});
    }
    
    map.entrySet().stream().sorted(new Comparator<Map.Entry<Integer, int[]>>() {
        @Override
        public int compare(Map.Entry<Integer, int[]> o1, Map.Entry<Integer, int[]> o2) {
            if (o2.getValue()[0]==o1.getValue()[0])
                return o1.getValue()[1]-o2.getValue()[1];
            return o2.getValue()[0]-o1.getValue()[0];
        }
        
        
        
    }).forEach(i->{
        for (int j=0; j<i.getValue()[0]; j++)
            sb.append(i.getKey()+" ");
    });
    System.out.print(sb);
    }
}

풀이방법

map으로 해당 값들을 key로 받으면서, 같은 값이 들어올때마다 +1
정렬해서 출력하는 방법에 대해 Comparator를 사용했는데
잘 모르겠다. 아직

알아 볼 것

comparator 생성자

참고

https://dalconbox.com/185

profile
풀스택개발자가 될래요

0개의 댓글