문제
https://swexpertacademy.com/main/solvingProblem/solvingProblem.do
접근 방식
1. 암호문의 중간에서 삽입 혹은 삭제하는 명령어가 있기 때문에 삽입 및 삭제 연산이 자주 발생할 때 유리한 LinkedList 자료구조를 사용한다.
2. 각 명령어들을 `switch case`문을 사용하여 적절하게 분기 처리한다.
// [SWEA] 1230. 암호문3
import java.util.*;
import java.io.*;
// public
class Solution {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = 10;
for (int tc = 1; tc <= T; tc++) {
int N = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
LinkedList<String> passwords = new LinkedList<>();
for (int i = 0; i < N; i++) {
passwords.add(st.nextToken());
}
int M = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
int x, y;
for (int i = 0; i < M; i++) {
char command = st.nextToken().charAt(0);
x = Integer.parseInt(st.nextToken());
// 각 명령어에 따라 제어 과정을 나눈다.
switch (command) {
// 명령어가 I(삽입)일 경우
case 'I':
// 앞에서부터 X번째 암호문 바로 다음에 y개의 암호문을 삽입한다.
y = Integer.parseInt(st.nextToken());
for (int j = 0; j < y; j++) {
String password = st.nextToken();
passwords.add(x, password);
x += 1;
}
break;
// 명령어가 D(삭제)인 경우
case 'D':
// 앞에서부터 x번째 암호문 바로 다음부터 y개의 암호문을 삭제한다.
y = Integer.parseInt(st.nextToken());
for (int j = 0; j < y; j++) {
passwords.remove(x);
}
break;
// 명령어가 A(추가)인 경우
case 'A':
// 암호문 뭉치 맨 뒤에 x개의 암호문을 덧붙인다.
for (int j = 0; j < x; j++) {
passwords.add(st.nextToken());
}
break;
default:
break;
}
}
sb.append("#").append(tc).append(" ");
// 수정된 결과의 처음 10개 암호문을 출력한다.
for (int i = 0; i < 10; i++) {
sb.append(passwords.get(i)).append(" ");
}
sb.append("\n");
}
System.out.println(sb);
}
}
'Algorithm' 카테고리의 다른 글
[LeetCode] 2677. Chunk Array (0) | 2024.01.31 |
---|---|
[BOJ] 4779. 칸토어 집합 (1) | 2024.01.30 |
[SWEA] 10726. 이진수 표현 (0) | 2024.01.29 |
[SWEA] 1288. 새로운 불면증 치료법 (0) | 2024.01.29 |
[LeetCode] 2667. Create Hello World Function (0) | 2024.01.29 |