🅰 1228. 암호문 1
✏️ 문제 풀이
0 ~ 999999 사이의 수를 나열하여 만든 암호문이 있다.
암호문을 급히 수정해야 할 일이 발생했는데, 이 암호문은 특수 제작된 처리기로만 수정이 가능하다.
이 처리기는 다음과 같이 1개의 기능을 제공한다.
1. I(삽입) x, y, s : 앞에서부터 x의 위치 바로 다음에 y개의 숫자를 삽입한다. s는 덧붙일 숫자들이다.[ ex) I 3 2 123152 487651 ]
위의 규칙에 맞게 작성된 명령어를 나열하여 만든 문자열이 주어졌을 때, 암호문을 수정하고, 수정된 결과의 처음 10개 숫자를 출력하는 프로그램을 작성하여라.
Integer 타입의 List를 선언해주었고, list에 데이터를 입력해주었다.
I x y s는 x번 뒤에 y만큼의 데이터 s를 입력해주는 것이므로 먼저
1. 문자 읽기
2. 데이터가 들어갈 x번째 자리 읽기
3. y를 읽어서 y번 만큼 입력 반복
4. 입력 데이터 s 입력 후 list에 넣기
add(index, data)를 이용하여서 add(x,s) 를 해주었고,
s가 x, x+1, x+2자리 순서로 들어가야 y개의 데이터가 일렬로 들어가므로 index부분에 x+i를 해주었다.
✏️ 소스코드
package linkedList;
import java.util.*;
import java.io.*;
public class Solution_D3_Sw1228_손은성 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int testCase = 1; testCase <= 10; testCase++) {
LinkedList<Integer> list = new LinkedList<>();
int T = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < T; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
int N = Integer.parseInt(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
String I = st2.nextToken();
int input = Integer.parseInt(st2.nextToken());
int cnt = Integer.parseInt(st2.nextToken());
for (int j = 0; j < cnt; j++) {
list.add(input + j, Integer.parseInt(st2.nextToken()));
}
}System.out.printf("#%d ",testCase);
for (int i = 0; i < 10; i++) {
System.out.printf("%d ", list.get(i));
}System.out.println();
}
}
}
✅ 후기
List api를 이용하여서 쉽게 구현할 수 있었다. 하지만 직접 List를 구현해서 사용해라 했으면 복잡했을 것 같다.
🅰 1229. 암호문 2
✏️ 문제 풀이
0 ~ 999999 사이의 수를 나열하여 만든 암호문이 있다. 암호문을 급히 수정해야 할 일이 발생했는데,
이 암호문은 특수 제작된 처리기로만 수정이 가능하다. 이 처리기는 다음과 같이 2개의 기능을 제공한다.
\1. I(삽입) x, y, s : 앞에서부터 x의 위치 바로 다음에 y개의 숫자를 삽입한다. s는 덧붙일 숫자들이다.[ ex) I 3 2 123152 487651 ]
\2. D(삭제) x, y : 앞에서부터 x의 위치 바로 다음부터 y개의 숫자를 삭제한다.[ ex) D 4 4 ]
위의 규칙에 맞게 작성된 명령어를 나열하여 만든 문자열이 주어졌을 때, 암호문을 수정하고, 수정된 결과의 처음 10개 숫자를 출력하는 프로그램을 작성하여라.
암호문 1번이랑 문제가 같다.
다만 삭제연산이 추가 되었으므로 switch문을 사용하여 문자를 비교해서 I가 들어오면 삽입 연산을 수행하고 D가 들어오면 y만큼 반복하여 remove(x)를 해주었다.
✏️ 소스코드
package linkedList;
import java.util.*;
import java.io.*;
public class Solution_D3_Sw1229_손은성 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int testCase = 1; testCase <= 10; testCase++) {
LinkedList<Integer> list = new LinkedList<>();
int T = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < T; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
int N = Integer.parseInt(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
String I = st2.nextToken();
switch(I) {
case "I" :
int input = Integer.parseInt(st2.nextToken());
int cnt = Integer.parseInt(st2.nextToken());
for (int j = 0; j < cnt; j++) {
list.add(input + j, Integer.parseInt(st2.nextToken()));
}
break;
case "D" :
input = Integer.parseInt(st2.nextToken());
cnt = Integer.parseInt(st2.nextToken());
for (int j = 0; j < cnt; j++) {
list.remove(input);
}
break;
}
}System.out.printf("#%d ",testCase);
for (int i = 0; i < 10; i++) {
System.out.printf("%d ", list.get(i));
}System.out.println();
}
}
}
✅ 후기
🅰 1230. 암호문 3
✏️ 문제 풀이
0 ~ 999999 사이의 수를 나열하여 만든 암호문이 있다.
암호문을 급히 수정해야 할 일이 발생했는데, 이 암호문은 특수 제작된 처리기로만 수정이 가능하다.
이 처리기는 다음과 같이 3개의 기능을 제공한다.
\1. I(삽입) x, y, s : 앞에서부터 x의 위치 바로 다음에 y개의 숫자를 삽입한다. s는 덧붙일 숫자들이다.[ ex) I 3 2 123152 487651 ]
\2. D(삭제) x, y : 앞에서부터 x의 위치 바로 다음부터 y개의 숫자를 삭제한다.[ ex) D 4 4 ]
\3. A(추가) y, s : 암호문의 맨 뒤에 y개의 숫자를 덧붙인다. s는 덧붙일 숫자들이다. [ ex) A 2 421257 796813 ]
위의 규칙에 맞게 작성된 명령어를 나열하여 만든 문자열이 주어졌을 때, 암호문을 수정하고, 수정된 결과의 처음 10개 숫자를 출력하는 프로그램을 작성하여라.
마찬가지로 암호문 2번의 switch문에 A를 추가하여 구현해주었다.
암호문의 맨 뒤에 추가하는 것이므로 addLast를 이용하여 마지막 부분에 데이터 s를 삽입해주었다.
addFirst, addLast, add(index,data), add(data) 등등등
✏️ 소스코드
} }
package linkedList;
import java.util.*;
import java.io.*;
public class Solution_D3_Sw1230_손은성 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int testCase = 1; testCase <= 10; testCase++) {
LinkedList<Integer> list = new LinkedList<>();
int T = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < T; i++) {
list.add(Integer.parseInt(st.nextToken()));
}
int N = Integer.parseInt(br.readLine());
StringTokenizer st2 = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
String I = st2.nextToken();
switch(I) {
case "I" :
int input = Integer.parseInt(st2.nextToken());
int cnt = Integer.parseInt(st2.nextToken());
for (int j = 0; j < cnt; j++) {
list.add(input + j, Integer.parseInt(st2.nextToken()));
}
break;
case "D" :
input = Integer.parseInt(st2.nextToken());
cnt = Integer.parseInt(st2.nextToken());
for (int j = 0; j < cnt; j++) {
list.remove(input);
}
break;
case "A" :
cnt = Integer.parseInt(st2.nextToken());
for (int j = 0; j < cnt; j++) {
list.addLast(Integer.parseInt(st2.nextToken()));
}
}
}System.out.printf("#%d ",testCase);
for (int i = 0; i < 10; i++) {
System.out.printf("%d ", list.get(i));
}System.out.println();
}
}
}
✅ 후기
댓글