문제
- 백준 15953
1-1. 예제는 잘 되는데 계속 런타임에러 (Nullpointer) 가 뜸
시도
- 백준 15953
1-1. BufferedReader, BufferedWriter 말고 Scanner를 사용
-> 똑같이 런타임에러
1-2. 왠지 map을 사용하고 있는 중에 뭔가 이상한 곳을 가르키고 있을 것이라는 생각이 들었다.
해결
- 백준 15953
1-1. first에 put을 사용할 때, 21을 넘어가는 시점에서 first.put(i, 0)가 아니라 first.put(i + 1, 0)를 하고 있었다.
-> 예전 코드에서 수정하다가 아래부분을 놓침
-> 이렇게 되면 22등일 경우 map에 key == 22 인 항목이 존재하지 않아서 nullPointer가 되는 것...
-> 해결
알게 된 점
- 백준 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();
}
}