Algorithm/SW Expert Academy

[SWEA] 1229 암호문2

SSONGMI 2021. 2. 22. 22:15
반응형

문제 출처: SW Expert Academy

 

SW Expert Academy

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

swexpertacademy.com

: 기본 암호문이 주어지고 처리기에 따라 다른 수정을 한 후 최종 암호문의 처음 10개 항을 출력한다.

 

: 원본 암호문의 길이와 암호문을 입력받는다.

: 명령어 개수를 입력받는다.

: 명령어를 입력받는다.

: 명령어를 순회하면서 명령어가 I이면 정해진 위치 x 바로 다음에 y개의 숫자 s를 삽입한다.

: 명령어가 D이면 정해진 위치 x 바로 다음 위치부터 y개의 숫자를 삭제한다.

: 이때 암호문의 길이는 계속 변하고 중간에 삽입삭제가 이루어져야 하므로 ArrayList를 사용한다.

: 또한 주어진 위치 x는 1 based-index이므로 add와 remove에서 값 조정 없이 사용할 수 있다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
 
public class Solution {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    public static void main(String[] args) throws IOException {
        // 테스트 케이스 횟수만큼 반복
        for(int tc = 1; tc <= 10; tc++) {
            // 원본 암호문 길이 입력
            int N = Integer.parseInt(br.readLine());
            // 원본 암호문 저장
            ArrayList<Integer> pw = new ArrayList<>();
            st = new StringTokenizer(br.readLine());
            for(int i = 0; i < N; i++) {
                pw.add(Integer.parseInt(st.nextToken()));
            }
             
            // 명령어개수 입력
            int commandN = Integer.parseInt(br.readLine());
             
            // 명령어 받기
            st = new StringTokenizer(br.readLine());
             
            // 명령어를 순회하면서
            while(st.hasMoreTokens()) {
                String command = st.nextToken();
                int x = Integer.parseInt(st.nextToken());
                int y = Integer.parseInt(st.nextToken());
                if(command.equals("I")) {
                    // 명령어가 I면 x위치 바로 다음에 y개의 숫자를 삽입
                    for(int i = 0; i < y; i++) {
                        pw.add(x++, Integer.parseInt(st.nextToken()));
                    }
                }else if(command.equals("D")) {
                    // 명령어가 D면 x위치 바로 다음부터 y개의 숫자 삭제
                    for(int i = 0; i < y; i++) {
                        pw.remove(x);                       
                    }
                }
            }
            sb.append("#" + tc + " ");
            for(int i = 0; i < 10; i++)
                sb.append(pw.get(i) + " ");
            sb.append("\n");
        }
        System.out.println(sb);
    }
}
반응형