✔ 난이도 - Silver 4

❌ 처음에는 순회하면서 K의 배수들을 원래 리스트에서 remove() 하면서 정답 리스트에 add()해주는 방식으로 하려 했으나 그렇게 되면 기존 리스트가 계속 변경되어 인덱스가 꼬이게 된다. 즉, 한 번 끝까지 순회할때까지 리스트는 변동되면 안됨!
⭕ 리스트의 끝을 마주하면 다시 리스트의 처음으로 돌아가서 다시 순회하는 방식인데 그건 곧 한 번 쭉 훑으면서 조건에 만족하지 못하는 애들은 리스트의 맨 뒤로 보내는 것과 동일하다. 이 방식대로 진행.
처음에는 아래처럼 길게 코드를 씀
sb.append('<'); while (list.size() != 0) { for (int i = 0; i < K; i++) { if (i != (K - 1)) { list.add(list.remove()); } else { if (list.size() != 1) { sb.append(list.remove()).append(", "); } else { sb.append(list.remove()); } } } } sb.append('>');그러나 이렇게 쓰면 조금 더 간결하게 코드를 구성할 수 있음
sb.append('<'); while (list.size() != 0) { for (int i = 0; i < K - 1; i++) { list.addLast(list.removeFirst()); } sb.append(list.removeFirst()); if (list.size() != 0){ sb.append(", "); } } sb.append('>');풀이
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
LinkedList<Integer> list = new LinkedList<>();
for (int i = 1; i <= N; i++){
list.add(i);
}
sb.append('<');
while (list.size() != 0) {
for (int i = 0; i < K; i++) {
if (i != (K - 1)) {
list.add(list.remove());
} else {
if (list.size() != 1) {
sb.append(list.remove()).append(", ");
} else {
sb.append(list.remove());
}
}
}
}
sb.append('>');
System.out.println(sb);
}
}
### TIL💡
📌 remove(index)나 remove()를 사용하면 삭제한 값을 리턴받을 수 있으므로 리턴받은 값으로 다시 어떠한 작업을 수행하는 방식도 존재한다는 것을 기억하자!
📌 https://velog.io/@seha01130/LinkedList-메소드-정리

