백준 10250, 4949, 2910

찬들이·2022년 7월 25일
0

알고리즘

목록 보기
14/42

문제 (성공)


(문제 설명이 길어서 짤린 부분은 아래 링크에 있습니다.)
https://www.acmicpc.net/problem/10250

소스코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class boj10250 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int T = Integer.parseInt(br.readLine());
        for(int i = 0; i < T; i++) {
            st = new StringTokenizer(br.readLine());
            int H = Integer.parseInt(st.nextToken());
            int W = Integer.parseInt(st.nextToken());
            int N = Integer.parseInt(st.nextToken());
            if(N % H == 0) {
                System.out.println((H * 100) + (N / H));
            } else {
                System.out.println(((N % H) * 100) + ((N / H) + 1));
            }
        }
    }
}

풀이 접근

  1. 문제에서 주어지는 입력 값 H,W,N을 저장한다.
  2. N%H에서 N이 6의 배수인 경우에는 0이 됨으로 예외처리를 해주고, 나머지는 층 수로, 몫 +1 은 호수로 출력한다.

문제 핵심

  • W가 입력은 받지만, 사용 되어지지 않는다는 사실을 확인한다.

문제 (성공)

소스코드

import java.io.*;
import java.util.*;
public class boj4949 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        boolean isTrue = true;
        while(isTrue) {
            Stack<Character> stack1 = new Stack();
            char[] arr = br.readLine().toCharArray();
            if (arr.length == 1 && arr[arr.length - 1] == '.') {
                isTrue = false;
                break;
            } else {
                for (int i = 0; i < arr.length; i++) {
                    if (arr[i] == '(') {
                        stack1.add(arr[i]);
                    } else if (arr[i] == '[') {
                        stack1.add(arr[i]);
                    } else if (arr[i] == ')') {
                        if (stack1.isEmpty()) {
                            stack1.add(arr[i]);
                            break;
                        } else if(stack1.peek() == '(') {
                            stack1.pop();
                        }else{
                            break;
                        }
                    } else if (arr[i] == ']') {
                        if (stack1.isEmpty()) {
                            stack1.add(arr[i]);
                            break;
                        } else if(stack1.peek() == '[') {
                            stack1.pop();
                        }else{
                            break;
                        }
                    }
                }
            }
            if(stack1.isEmpty()){
                sb.append("yes" +"\n");
            }else{
                sb.append("no" + "\n");
            }
        }
        System.out.println(sb);
    }
}

풀이 접근

  1. 문제에서는 소괄호와 대괄호를 기준으로 균형을 맞춘다.
  2. 열린 괄호가 있으면 무조껀 닫힌 가로가 균형을 이뤄야한다.
  3. (, [가 나올 때는 stack에 add를하고, )와]가 나올 때는 stack에 peek()값이 같은 괄호에 여는 괄호로 나오면 반복문을 이어가고, 그렇지 않으면 stack에 add하고 종료한다.
  4. 만약에 stack에 내용물이 없다면 문자열이 균형을 이룬다는 뜻으로 yes를 추가하고, 그렇지 않다면 no를 추가한다.
  5. StringBuilder를 통해 한 번에 출력한다.

문제 핵심

  • stack에 대한 이해
  • peek 메소드 통한 비교

문제 2910번 (실패)

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Comparator;
public class boj2910 {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(" ");
        int N = Integer.parseInt(str[0]);
        str = br.readLine().split(" ");
        HashMap<Integer, Integer> list = new LinkedHashMap<Integer, Integer>();
        for (int i = 0; i < N; i++) {
            if (list.containsKey(Integer.parseInt(str[i]))) {
                list.replace(Integer.parseInt(str[i]), list.get(Integer.parseInt(str[i])) + 1);
            }
            else {
                list.put(Integer.parseInt(str[i]), 1);
            }
        }
        ArrayList<Integer> v = new ArrayList<Integer>(list.keySet());
        Collections.sort(v, new Comparator<Integer>() {
            @Override
            public int compare(Integer a, Integer b) {
                return Integer.compare(list.get(b), list.get(a));
            }
        });
        Iterator<Integer> it = v.iterator();
        while (it.hasNext()) {
            Integer element = it.next();
            for(int i=0; i<list.get(element); i++){
                System.out.print(element+" ");
            }
        }
    }
}

풀이 접근

  1. 먼저 입력으로 N의 값을 받는다.
  2. Hashmap Integer, Integer 값으로 만든다.
  3. for문을 통해서 이미 입력된 key 값이 있다면 value 값에 +1을
    아니라면 key 값을 추가한다.
  4. 시간 복잡도를 줄이기 위해서 Collections.sort로 Comparator()로 정렬을 해주고, Iterator를 통해서 출력해 준다.

문제 핵심

  • Hashmap 을 통해서 key 값과 value값을 저장할 수 있는가
  • Collection.sort를 활용할 수 있는가
  • Iterator를 사용해서 출력할 수 있는가
profile
Junior-Backend-Developer

0개의 댓글