SWEA(SWExpertacAdemy)

[SWEA] 22979. 문자열 옮기기 D3 (자바)

심층코드 2025. 5. 22. 11:28

22979. 문자열 옮기기 D3

[문제]

문자열 S에 다음과 같은 연산을 몇 번 적용할 것이다.

각각의 연산은 정수 X로 표현되며, X에 따라 문자열 S가 아래와 같이 변한다.

 

· X > 0이면, S의 첫 번째 글자를 떼네어 마지막 글자 뒤에 붙이는 작업을 정확히 X회 반복한다.

· X < 0이면, S의 마지막 글자를 떼네어 첫 번째 글자 앞에 붙이는 작업을 정확히 -X회 반복한다.

· X = 0이면, 아무 일도 일어나지 않는다.

 

모든 연산이 종료된 후 문자열 S를 출력하는 프로그램을 작성하라.

 

 

[입력]

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 테스트 케이스는 세 개의 줄로 이루어진다. 첫 번째 줄에는 문자열 S가 주어진다. S는 알파벳 소문자로만 구성되며, 길이가 1 이상 1,000 이하이다. 
두 번째 줄에는 연산의 횟수 K가 주어진다. K는 1 이상 100 이하의 정수이다. 
세 번째 줄에는 K개의 정수가 공백 하나씩을 사이로 두고 주어지며, 각각의 정수는 순서대로 문자열에 적용하는 연산을 나타낸다. 
세 번째 줄에 주어지는 정수는 -10이상 109 이하이다.

 

 

[출력]

각 테스트 케이스마다, 주어진 연산을 모두 순서대로 적용한 뒤의 문자열 S를 출력한다.

 

입력 예제 출력 예제
2
abcde
1
3
samsung
5
3 2 -6 4 2
 
deabc
ngsamsu

 

 

입력
2
abcde
1
3
samsung
5
3 2 -6 4 2
 
 
출력
deabc
ngsamsu

[코드1] Fail (제한시간 초과)

import java.io.*;
import java.util.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for (int i = 1; i <= T; i++) {
        	String s=br.readLine();
        	int N=Integer.parseInt(br.readLine());
        	
        	List<Character> list1=new ArrayList<>();
        	
        	for (int i2 = 0; i2 < s.length(); i2++) {
            	list1.add(s.charAt(i2));				
			}
        	
        	
        	StringTokenizer st = new StringTokenizer(br.readLine());
        	for (int i3 = 0; i3 < N; i3++) {
				int A=Integer.parseInt(st.nextToken());
				if (A>0) {
					for (int i4 = 0; i4 < A; i4++) {
						char tmp=list1.get(0);
						list1.remove(0);
						list1.add(tmp);
					}
				}
				else if (A<0) {
					for (int i4 = 0; i4 < -(A); i4++) {
						char tmp=list1.get(list1.size()-1);
						list1.remove(list1.size()-1);
						List<Character> list2=new ArrayList<>(list1);
						list1.clear();
						list1.add(tmp);
						for (int i5 = 0; i5 < list2.size(); i5++) {
							list1.add(list2.get(i5));
						}
					}
				}
        	}
        	String result="";
        	for (int i6 = 0; i6 < list1.size(); i6++) {
				result+=list1.get(i6);
			}
        	System.out.println(result);
        }
        br.close();
    }
}

 

 

[코드2] Collections.rotate(리스트명, 회전수); 사용

 

import java.io.*;
import java.util.*;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        for (int i = 1; i <= T; i++) {
        	String s=br.readLine();
        	int N=Integer.parseInt(br.readLine());
        	
        	List<Character> list1=new ArrayList<>();
        	
        	for (int i2 = 0; i2 < s.length(); i2++) {
            	list1.add(s.charAt(i2));				
			}
        	
        	
        	StringTokenizer st = new StringTokenizer(br.readLine());
        	for (int i3 = 0; i3 < N; i3++) {
				int A=Integer.parseInt(st.nextToken());
					Collections.rotate(list1, -A);
        	}
        	
        	String result="";
        	for (int i6 = 0; i6 < list1.size(); i6++) {
				result+=list1.get(i6);
			}
        	System.out.println(result);
        }
        br.close();
    }
}