본문 바로가기

알고리즘 문제풀이/SWEA(SW Expert Academy)

[SWEA][JAVA]1228번 - 암호문1

문제 출처 :  https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14w-rKAHACFAYD&categoryId=AV14w-rKAHACFAYD&categoryType=CODE&problemTitle=1228&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

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

swexpertacademy.com

 

문제

 

설명

배열 사이즈를 동적으로 변경 가능한 Collection의 List를 사용하는 것이 이 문제의 핵심입니다.

ArrayList를 사용하긴 했는데, 사실 배열을 조작하는 데 있어서 LinkedList가 드는 비용이 더 적기 때문에 LinkedList를 사용하는 것이 더 낫다고 할 수 있습니다.

명령어들 입력이 들어오는 대로 바로 처리하도록 하는 게 좋은데, 처음 풀 때 잘못 접근해서 이 명령어들 하나 하나를 배열에 따로 넣고 처리하려고 하는 바람에 좀 헤맸던 문제였습니다ㅠㅠ

 

코드

import java.util.ArrayList;
import java.util.Scanner;

public class SWEA1228_CyperText {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		StringBuilder sb = new StringBuilder();
		
		for(int tc=1; tc<=10; tc++) {
			int length = sc.nextInt(); //원본 암호문의 길이
			ArrayList<String> list = new ArrayList<>();
			
			for(int i=0; i<length; i++) //원본 암호문을 순서대로 저장
				list.add(sc.next());
			
			int cmd = sc.nextInt(); //명령어의 갯수
			
			for(int i=0; i<cmd; i++) { //총 명령어의 갯수만큼 반복함
				if(sc.next().equals("I")) {
					int x = sc.nextInt(); // 숫자를 덧붙일 위치
					int y = sc.nextInt(); //덧붙일 숫자의 갯수
					
					ArrayList<String> list2 = new ArrayList<>();
					for(int j=0; j<y; j++) {
						list2.add(sc.next());
					} // 덧붙일 숫자 s를 순서대로 리스트에 저장
					
					list.addAll(x, list2); // 덧붙이는 작업을 한 번에 수행
					
				}
			}
			
			sb.append("#"+tc+" ");
			for(int i=0; i<10; i++) {
				sb.append(list.get(i)+" ");
			}
			sb.append("\n");
		}
	  System.out.print(sb);
	}
}