JAN's History
12주차_백준 문제풀이 본문
목차
- 2504
- 4358
- 1406
문제 2504
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String N = br.readLine();
Stack<Character> stack = new Stack<>();
int result = 0;
int value = 1;
for(int i = 0; i < N.length(); i++) {
if(N.charAt(i) == '(') {
stack.push(N.charAt(i));
value *= 2; //( : 2
} else if(N.charAt(i) == '[') {
stack.push(N.charAt(i));
value *= 3; //[ : 3
} else if(N.charAt(i) == ')') {
if(stack.isEmpty() || stack.peek() != '(') {
result = 0;
break;
} else if(N.charAt(i-1) == '(') {
result += value;
}
stack.pop();
value /= 2;
} else if(N.charAt(i) == ']') {
if (stack.isEmpty() || stack.peek() != '[') {
result = 0;
break;
} else if (N.charAt(i - 1) == '[') {
result += value;
}
stack.pop();
value /= 3;
}
}
if(!stack.isEmpty()) sb.append(0).append("\n");
else sb.append(result).append("\n");
System.out.println(sb);
}
}
코드 설명
1.(', '['를 만나면 stack에 해당 괄호를 넣고 value 값에 각각의 2, 3의 값을 곱해준다.
2. ')'을 만나면?
- 1.스택이 비어있거나, 스택에 '('이 없으면 ? result 값을 0으로 변경 후 반복문 탈출!
- 2. 바로 이전의 값이 '('이면 ? value 값을 result에 더해준다.
- 3.stack에서 한개 빼기
3. ']'을 만나면?
- 1. 2번과 동일!
4. 만약 스택이 비어있다면 ? 0출력 그렇지 않으면 결과값 출력
문제 4358
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
// 생태학
// 문자열 문제(해시맵 ?)
public class p4358 {
static HashMap<String, Integer> trees;
static int allCount;
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
trees = new HashMap<String, Integer>();
String str = br.readLine();
while(true) {
trees.put(str, trees.getOrDefault(str, 0) + 1);
allCount++;
str = br.readLine();
if(str == null || str.length() == 0) {
break;
}
}
// 키 오름차순 정렬
Object[] keys = trees.keySet().toArray();
Arrays.sort(keys);
StringBuilder sb = new StringBuilder();
for(Object key : keys) {
String keyStr = (String) key;
int count = trees.get(keyStr);
double per = (double)(count * 100.0) / allCount;
sb.append(keyStr + " " + String.format("%.4f", per) + "\n"); // 소수점 4번 째 자리까지 출력
}
System.out.println(sb.toString());
}
추가 설명
백분율을 구하기 위해 각 종의 전체 개수를 별도로 파악해서 저장해놓아야 합니다.
자바에서는 간단하게 소수점 N번 째 짜리까지 출력할 수 있는데요.
바로,
double per = (double)(count * 100.0) / allCount;
String.format("%.4f", per);
입니다.
int형으로 연산하면은 소수점까지 계산되지 않고 정수로만 출력되기 때문에
무조건 double 사용해야 합니다!
문제 2504
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<Character> leftStack = new Stack<>();
Stack<Character> rightStack = new Stack<>();
for(int i = 0; i < str.length(); i++){
leftStack.push(str.charAt(i));
}
int N = Integer.parseInt(br.readLine());
for(int i = 0; i < N; i++){
String cmd = br.readLine();
switch (cmd.charAt(0)){
case 'L':
if(leftStack.empty()) break;
rightStack.push(leftStack.pop());
break;
case 'D':
if(rightStack.empty()) break;
leftStack.push(rightStack.pop());
break;
case 'B':
if(leftStack.empty()) break;
leftStack.pop();
break;
case 'P':
leftStack.push(cmd.charAt(2));
break;
}
}
while(!leftStack.empty()){
rightStack.push(leftStack.pop());
}
StringBuilder sb = new StringBuilder();
while (!rightStack.empty()){
sb.append(rightStack.pop());
}
System.out.println(sb.toString());
}
}
추가 설명
L : 커서를 왼쪽으로 한 칸 옮김 --> 왼쪽 스택에서 pop한 값을 오른쪽 스택에 push함
D : 커서를 오른쪽으로 한 칸 옮김 --> 오른쪽 스택에서 pop한 값을 왼쪽 스택에 push함
B : 커서 왼쪽에 있는 문자를 삭제함 --> 왼쪽 스택 pop
P $ : $라는 문자를 커서 왼쪽에 추가함 --> 왼쪽 스택 push
'백준' 카테고리의 다른 글
14주차_백준 문제풀이 (0) | 2023.08.11 |
---|---|
10주차_백준 문제풀이 (0) | 2023.07.09 |
9주차_백준 문제풀이 (0) | 2023.06.24 |
8주차_백준 문제풀이 (0) | 2023.06.18 |
7주차_백준 문제풀이 (0) | 2023.05.28 |