문제링크
시간 : 10개 테스트케이스를 합쳐서 C++의 경우 1초 / Java의 경우 2초 / Python의 경우 4초
메모리 : 힙, 정적 메모리 합쳐서 256MB 이내, 스택 메모리 1MB 이내
0 ~ 999999 사이의 수로 표현되는 암호문이 있고, 이 암호문을 N개 모아 놓은 암호문 뭉치가 있다.
암호문 뭉치를 급히 수정해야 할 일이 발생했는데, 암호문은 특수 제작된 처리기로만 수정이 가능하다.
처리기는 다음과 같이 3개의 명령어로 제어한다.
I(삽입) x, y, s : 앞에서부터 x번째 암호문 바로 다음에 y개의 암호문을 삽입한다. s는 덧붙일 암호문들이다.[ ex) I 3 2 123152 487651 ]
D(삭제) x, y : 앞에서부터 x번째 암호문 바로 다음부터 y개의 암호문을 삭제한다.[ ex) D 4 4 ]
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를 줬다