23-06-08 TIL

more·2023년 6월 8일
0

문제

  1. 백준 15953
    1-1. 예제는 잘 되는데 계속 런타임에러 (Nullpointer) 가 뜸

시도

  1. 백준 15953
    1-1. BufferedReader, BufferedWriter 말고 Scanner를 사용
    -> 똑같이 런타임에러
    1-2. 왠지 map을 사용하고 있는 중에 뭔가 이상한 곳을 가르키고 있을 것이라는 생각이 들었다.

해결

  1. 백준 15953
    1-1. first에 put을 사용할 때, 21을 넘어가는 시점에서 first.put(i, 0)가 아니라 first.put(i + 1, 0)를 하고 있었다.
    -> 예전 코드에서 수정하다가 아래부분을 놓침
    -> 이렇게 되면 22등일 경우 map에 key == 22 인 항목이 존재하지 않아서 nullPointer가 되는 것...
    -> 해결

알게 된 점

  1. 백준 15953
    -> 코드 수정을 하게 되면 이전에 있던 코드들을 하나씩 제대로 수정해야하는데 그 부분에 있어서 경솔하게 넘어간 부분이 있었다.
    -> 코드 수정을 조금 더 꼼꼼하게 하자!!!

오늘 푼 문제

백준 4949 (균형잡힌 세상) - Java
  • Stack에 대한 개념을 알고 사용할 수 있는가에 대한 문제였던 거 같다.
  • Java는 Stack이 구현되어 있어서 사용만 하면 돼서 편하긴한데, 구현해서 사용하는 것도 해봐야 할 듯
import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        while (true) {
            String st = br.readLine();
            // 온점 하나만 들어오면 loop 탈출
            if (st.equals(".")) {
                break;
            }
            else {
            	// checkBracket() 이 true면 yes, false면 no
                if (checkBracket(st))   bw.write("yes\n");
                else bw.write("no\n");
            }
        }

        bw.flush();
        bw.close();
        br.close();
    }

	// 스택을 사용해서 확인하는 메서드
    private static boolean checkBracket(String s) {
        Stack<Character> bracket = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char ch = s.charAt(i);
            // '('나 '['만 스택에 집어넣고 ')'나 ']'가 입력되면 스택에서 제거
            if (ch == '(' || ch == '[') bracket.push(ch);
            else if (ch == ')') {
            	// 스택이 비었거나 맨 위 스택이 '('이 아니면 틀린 것 
                if (bracket.isEmpty() || bracket.peek() != '(') {
                    return false;
                } else {
                	// ')'를 집어넣지 말고 기존에 있는 '('를 제거
                    bracket.pop();
                }
            } else if (ch == ']') {
            	// 스택이 비었거나 맨 위 스택이 '['이 아니면 틀린 것
                if (bracket.isEmpty() || bracket.peek() != '[') {
                    return false;
                } else {
                	// ']'를 집어넣지 말고 기존에 있는 '['를 제거
                    bracket.pop();
                }
            }
        }
        // 스택에서 '(', '['이 하나도 없이 다 빠졌거나, 원래 비어있었으면 true
        if (bracket.isEmpty())
            return true;
        // 스택에 무슨 값이 있다면 괄호가 닫히지 않았다는 뜻이므로 false
        return false;
    }
}
백준 15953 (상금 헌터) - Java
  • 그냥 배열로 처리할 수도 있긴 한데 한번 map을 써보고 싶어서 사용했다.
  • 간단한 if문 문제이므로 별도의 주석은 필요 없을 듯...?
import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        Map<Integer, Integer> first = new HashMap<>();
        Map<Integer, Integer> second = new HashMap<>();

		// 상금을 저장
        // key = 순위, value = 상금
        for (int i = 0; i <= 100; i++) {
            if (i == 0) first.put(i, 0);
            else if (i <= 1) first.put(i, 500);
            else if (i <= 3) first.put(i, 300);
            else if (i <= 6) first.put(i, 200);
            else if (i <= 10) first.put(i, 50);
            else if (i <= 15) first.put(i, 30);
            else if (i <= 21) first.put(i, 10);
            else first.put(i, 0);
        }

		// 상금을 저장
        // key = 순위, value = 상금
        for (int i = 0; i <= 64; i++) {
            if (i == 0) second.put(i, 0);
            else if (i <= 1) second.put(i, 512);
            else if (i <= 3) second.put(i, 256);
            else if (i <= 7) second.put(i, 128);
            else if (i <= 15) second.put(i, 64);
            else if (i <= 31) second.put(i, 32);
            else second.put(i, 0);
        }

        int N = Integer.parseInt(br.readLine());

        for (int i = 0; i < N; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            // 각 순위에 맞는 상금을 더하고, 만원 단위이므로 * 10000
            bw.write((first.get(a) + second.get(b)) * 10000 + "\n");
        }

        bw.flush();
        bw.close();
        br.close();
    }

}

0개의 댓글