본문 바로가기
알고리즘/SWEA

[Java] SWEA1228_암호문1

by 댕꼬 2022. 3. 17.
728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14w-rKAHACFAYD 

 

SW Expert Academy

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

swexpertacademy.com

[문제]

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();
		}

	}

}
728x90

'알고리즘 > 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

댓글