[SWEA] 1230. 암호문3 (java)

Charbs·2024년 1월 16일

algorithm

목록 보기
18/37

문제링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14zIwqAHwCFAYD&categoryId=AV14zIwqAHwCFAYD&categoryType=CODE&problemTitle=1230&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

시간 : 10개 테스트케이스를 합쳐서 C++의 경우 1초 / Java의 경우 2초 / Python의 경우 4초
메모리 : 힙, 정적 메모리 합쳐서 256MB 이내, 스택 메모리 1MB 이내


문제

0 ~ 999999 사이의 수로 표현되는 암호문이 있고, 이 암호문을 N개 모아 놓은 암호문 뭉치가 있다.

암호문 뭉치를 급히 수정해야 할 일이 발생했는데, 암호문은 특수 제작된 처리기로만 수정이 가능하다.

처리기는 다음과 같이 3개의 명령어로 제어한다.

  1. I(삽입) x, y, s : 앞에서부터 x번째 암호문 바로 다음에 y개의 암호문을 삽입한다. s는 덧붙일 암호문들이다.[ ex) I 3 2 123152 487651 ]

  2. D(삭제) x, y : 앞에서부터 x번째 암호문 바로 다음부터 y개의 암호문을 삭제한다.[ ex) D 4 4 ]

  3. A(추가) y, s : 암호문 뭉치 맨 뒤에 y개의 암호문을 덧붙인다. s는 덧붙일 암호문들이다. [ ex) A 2 421257 796813 ]

위의 규칙에 맞게 작성된 명령어를 나열하여 만든 문자열이 주어졌을 때, 암호문 뭉치를 수정하고, 수정된 결과의 처음 10개 암호문을 출력하는 프로그램을 작성하여라.


[입력]

첫 번째 줄 : 원본 암호문 뭉치 속 암호문의 개수 N ( 2000 ≤ N ≤ 4000 의 정수)

두 번째 줄 : 원본 암호문 뭉치

세 번째 줄 : 명령어의 개수 ( 250 ≤ M ≤ 500 의 정수)

네 번째 줄 : 명령어

위와 같은 네 줄이 한 개의 테스트 케이스이며, 총 10개의 테스트 케이스가 주어진다.

[출력]

#기호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 수정된 암호문 뭉치의 앞 10개 암호문을 출력한다.

[제약 사항]

실행 시간 60ms 이하


너무 불편한 문제다. 문제가 명확하지 않았다.
입력, 출력도 해보기 힘들다
그래도 풀었다
ArrayList 사용 연습문제인 것 같다

풀이

import java.util.*;
import java.io.FileInputStream;

class Solution {
    public static void doCommand(ArrayList<Integer> data, char command, Scanner sc) {
        switch (command) {
            case 'I':
                int x = sc.nextInt(); // x번째 암호문 뒤에
                int y = sc.nextInt(); // y개 암호문 삽입
                for (int s = 0; s < y; s++) {
                    data.add(x + s, sc.nextInt());
                }
                break;
            case 'D':
                int xD = sc.nextInt(); // x번째 암호문 뒤에
                int yD = sc.nextInt(); // y개 암호문 삭제
                for (int s = 0; s < yD; s++) {
                    data.remove(xD);
                }
                break;
            case 'A':
                int yA = sc.nextInt(); // 맨 뒤 y개 암호문 삽입
                for (int s = 0; s < yA; s++) {
                    data.add(sc.nextInt());
                }
                break;
        }
    }

    public static void main(String args[]) throws Exception {

        Scanner sc = new Scanner(System.in);
        int T = 10;

        for (int test_case = 1; test_case <= T; test_case++) {
            int N = sc.nextInt(); // 암호문 개수
            ArrayList<Integer> data = new ArrayList<>(); // 암호문 뭉치
            for (int n = 0; n < N; n++) { // 원본 암호문 뭉치 입력
                data.add(sc.nextInt());
            }
            int M = sc.nextInt(); // 명령어의 개수
            for (int m = 0; m < M; m++) { // 명령어 입력
                char command = sc.next().charAt(0); // 명령어 종류 입력(I,D,A)
                doCommand(data, command, sc); // 명령어 실행
            }

            // 결과 출력
            System.out.print("#" + test_case + " ");
            for (int i = 0; i < 10; i++) {
                System.out.print(data.get(i) + " ");
            }
        }
    }
}

배운 것
1. I,D 명령 시 N번째 뒤 암호문에 작업을 하기에 인덱스에 주의
2. switch 문의 case가 다르더라도 변수 이름이 같으면 안된다.
3. 함수안에서 입력을 받기위해 매개변수로 sc를 줬다

profile
자두과자

0개의 댓글