문제

https://swexpertacademy.com/main/solvingProblem/solvingProblem.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

접근 방식

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

+ Recent posts