list 반복문에서 초기화
반복문 안에서 list를 초기화하고 싶다면, 객체를 다시 선언하지 말고
list.clear()로 초기화 한다. 그래야 메모리를 아낄 수 있다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
ArrayList<Integer> list = new ArrayList<>();
while(true) {
int n = Integer.parseInt(br.readLine());
if(n == -1) break; // 입력 검증
list.clear();
int sum = 1; // 초기값
list.add(1);
for(int i=2; i*i<=n; i++) {
// 앞의 절반의 약수들
// 뒤의 절반의 약수들
// 거듭제곱근은 빼고
if(n%i==0) {
sum+=i;
list.add(i);
if(i*i != n) {
sum+=n/i;
list.add(n/i);
}
}
}
Collections.sort(list);
if(sum == n) {
bw.write(n+" = ");
for(int num : list) {
if(num == list.get(list.size()-1)) bw.write(num+ "\n");
else bw.write(num+" + ");
}
} else {
bw.write(n+" is NOT perfect.\n");
}
}
bw.flush();
bw.close();
br.close();
}
}