https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14w-rKAHACFAYD
[문제]
0 ~ 999999 사이의 수를 나열하여 만든 암호문이 있다.
암호문을 급히 수정해야 할 일이 발생했는데, 이 암호문은 특수 제작된 처리기로만 수정이 가능하다.
이 처리기는 다음과 같이 1개의 기능을 제공한다.
1. I(삽입) x, y, s : 앞에서부터 x의 위치 바로 다음에 y개의 숫자를 삽입한다. s는 덧붙일 숫자들이다.[ ex) I 3 2 123152 487651 ]
위의 규칙에 맞게 작성된 명령어를 나열하여 만든 문자열이 주어졌을 때, 암호문을 수정하고, 수정된 결과의 처음 10개 숫자를 출력하는 프로그램을 작성하여라.
첫 번째 줄 : 원본 암호문의 길이 N ( 10 ≤ N ≤ 20 의 정수)
두 번째 줄 : 원본 암호문
세 번째 줄 : 명령어의 개수 ( 5 ≤ N ≤ 10 의 정수)
네 번째 줄 : 명령어
위와 같은 네 줄이 한 개의 테스트 케이스이며, 총 10개의 테스트 케이스가 주어진다.
[입력]
1
449047 855428 425117 532416 358612 929816 313459 311433 472478 589139 568205
7
I 1 5 400905 139831 966064 336948 119288 I 8 6 436704 702451 762737 557561 810021 771706 I 3 8 389953 706628 552108 238749 661021 498160 493414 377808 I 13 4 237017 301569 243869 252994 I 3 4 408347 618608 822798 370982 I 8 2 424216 356268 I 4 10 512816 992679 693002 835918 768525 949227 628969 521945 839380 479976
[출력]
#1 449047 400905 139831 408347 512816 992679 693002 835918 768525 949227
[풀이]
문제가 복잡해서 문제 분석을 하는데 꽤 오래걸렸던 문제이다.
숫자가 복잡해보여서 그렇지 원리는 매우 간단한 문제이다.
큰 숫자들을 알파벳으로 변경하여 간단하게 예를 들면 명령어들의 의미는 아래와 같다.
위 명령어를 예시로 들면 아래와 같다.
[원본암호문] [명령어 실행 후 암호문]
A B C D E F >>> A Z X C E F
이처럼 원하는 인덱스의 값을 쉽게 변경할 수 있도록 LinkedList를 사용하여 구현하였다.
리스트 명령어들을 사용하고 이해하기에 적합한 문제였다!
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class SWEA1228 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int t = 1; t <=10; t++) {
LinkedList<Integer> pw = new LinkedList<Integer>();
int size = Integer.parseInt(br.readLine()); // 원본 암호문의 길이
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < size; i++) { //원본 암호문
pw.add(Integer.parseInt(st.nextToken()));
}
int num = Integer.parseInt(br.readLine()); // 명령어의 개수
String s = br.readLine();
st = new StringTokenizer(s, " ");
for (int i = 0; i < num; i++) {
st.nextToken(); // 명령어I
int x = Integer.parseInt(st.nextToken()); //시작위치
int y = Integer.parseInt(st.nextToken()); //명령어개수
// .add(Index위치,넣을 값)
for (int j = 0; j < y; j++) {
pw.add(x, Integer.parseInt(st.nextToken())); //x자리에 명령어 넣고
x++; //x하나 증가
}
}
System.out.printf("#%d ",t);
for (int i = 0; i < 10; i++) {
System.out.printf("%d ",pw.get(i));
}System.out.println();
}
}
}
'알고리즘 > SWEA' 카테고리의 다른 글
[Java] SWEA1210_Ladder1 (1) | 2022.03.21 |
---|---|
[Java] SWEA1225_암호생성기 (0) | 2022.03.17 |
[Java] SWEA9229_한빈이와 Spot Mart (0) | 2022.03.17 |
[Java] SWEA5215_ 햄버거다이어트 (1) | 2022.03.17 |
[Java] SWEA1218_괄호짝짓기 (0) | 2022.03.16 |
댓글