알고리즘/SWEA

SWEA 1228 암호문1 Java

코드 공작소 2023. 6. 30. 14:24
반응형

[S/W 문제해결 기본] 8일차 - 암호문1] Java

문제보러가기


문제

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

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개의 테스트 케이스가 주어진다.


출력

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


제한


예제 입력

예제 출력

11
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
19
566753 244528 233616 328235 268163 292641 646305 944392 643695 385788 444752 939244 637877 325283 779273 712343 953523 846222 204307
5
I 0 4 600576 565945 486128 594841 I 0 1 150706 I 8 8 556294 697547 932203 845517 116062 300371 621038 358830 I 10 8 747039 701738 805438 502654 476665 919177 367272 859931 I 15 3 844423 973297 658751
#1 449047 400905 139831 408347 512816 992679 693002 835918 768525 949227
#2 150706 600576 565945 486128 594841 566753 244528 233616 556294 697547

풀이 과정

 

X의 위치에 Y개의 숫자를 add해주면 풀리는 문제이다. 리스트를 이용하면 쉽게 풀 수있다

add하는 과정에서 인덱스의 위치에 주의하자


Java 코드

import java.util.LinkedList;
import java.util.Scanner;
/*
1228 암호문 리스트로 풀기
 * 
 x의 위치에 y개의 숫자를 add해주면 된다. 다만 x의 위치는 add함에 따라 증가해야 정상적으로 들어간다.
 * */
public class S1228 {

	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N,K;
		for (int t = 1; t <= 10; t++) {
			int count=0;
			N = sc.nextInt();
			
			LinkedList<Integer> list = new LinkedList<>();		//리스트 선언
			
			for (int i = 0; i < N; i++) list.add(sc.nextInt());	//원본암호문 추가
			
			K = sc.nextInt();
			
			for (int q = 0; q < K; q++) {
				String s = sc.next();	//i 제거
				int x =sc.nextInt();	//넣을 인덱스
				int y = sc.nextInt();	//넣을 숫자
				
				for (int i = 0; i < y; i++) {
					list.add(x, sc.nextInt());	//삽입하면서 x값을 증가시켜 인덱스도 증가
					x++;
				}
			}
			System.out.printf("#%d ",t);
			while (!(list.isEmpty())) {
				if(count >9) break;
				System.out.print(list.poll() + " ");
				count++;
			}
			System.out.println();
		}
	}
}

 

반응형