자바 배운지 6일차
구구단과 별찍기 그리고 약수구하기 까지 배웠는데 하루만에 다 배우려고하니 머리가 터져버릴거같았다.
대망의 마지막 for문 문제는 완전수 구하기였는데 보스몹이라고 선생님께서 말씀하셨다 ㅋㅋ
다시 생각하지 않으면 for문을 잊어버릴거같아서
기록으로 남겨보려고한다.
먼저 완전수란 자기 자신을 제외한 양의 약수를 더했을 때 자기 자신이 되는 양의 정수를 말한다.
1부터 1000까지의 숫자를 입력받고 그 중에서 완전수를 구하는 코드를 작성하는 문제였다.
그리고 실행하면 다음의 결과가 나왔다.
6
28
496
일단 1부터 1000까지 계속 반복을하는
for문을 만들었다
for (int i = 1; i <= 1000; i++)
선생님께서 강조하신게 반복되는게 있으면 먼저 작성해보고
step 을 쪼개서 적어보라는것이였다.
내가 아는건 6 28 496의 결과기때문에
약수를 구하는 조건을 만들어야하는데 i % ? == 0
이 ? 에 들어가서 참이 되는건 무엇일까 계속 생각해봤다
도저히 풀리지가 않아서
for문을 한개 더 적어봤다
for (int j = 1; j <=i; j++)
엄청난 숫자들이 계속 출력됐다 ㅋㅋ
완전수를 구하기 위해선 자기 자신을 제외한 나머지를 더해야한다
그래서 int sum 이라는 변수를 하나 만들고
sum에 i % j ==0 이면 j를 더하면 되나? 라고 생각해서
sum += j; 라고 한뒤 sum을 출력해봤더니
쭉쭉쭉쭉 엄청난 숫자들이 나왔다..
혼자 해결못해서 선생님께서 작성한 코드를 봤는데
한시간 정도 생각을했다 왜 이렇게 나오는걸까?
이걸 못푼다는 자괴감에 빠졌지만 포기하지 않고 차분하게 for문의 실행순서를 찾아보고
손으로 적어봤다
public static void main(String[] args) {
//어려워
int sum = 0;
for (int i = 1; i <= 1000; i++) {
sum = 0;
for (int j = 1; j <i; j++) {
if (i % j == 0) {
sum += j;
}
}
if (sum == i)
System.out.println(i);
}
}
일단 손으로 for문이 이루어질때 i와 j그리고 if문까지 적어봤다
두번째 for문에서 i가 1일때 j=1 j<1 false이다 그렇다면
나가서 다시 첫번째 for문을 실행한다
그럼 i=2 j=1 j<2 true이기때문에
다음의 if문으로 넘어가서 2 % 1 ==0 -->true이기때문에 sum에는 1이 저장된다
그리고 나가서 sum == i와 같냐는 조건이 하나 더 있다 여기서 1==2 false
이렇게 3 4 5 6까지 써보니깐 이해가됐다
j = 1, j 가 6 보다 작을때 6 %1 ==0 6%2 ==0 6%3 ==0
sum에는 1+2+3 = 6 이 들어간다
그렇다면 sum == i와 같나? 그렇다
6이 출력된다
여기에는 내가 모르는 개념이 있었다
지역변수와 전역변수인데
for문 안에서의 sum은 밖에서 쓸수없었다 그래서
main 메소드 안에서 선언과 초기화 해주고
첫 번째 for문에서 또 초기화를 해준다. 왜 또 초기화를 해???
이유는 초기화를 하지 않으면 sum에 j가 계속 들어가기 때문이다..
만약 for문에서 초기화를 하지 않으면 저 코드는 1밖에 출력되지 않는다
내가 놓친 부분은 for문의 실행순서와
위에서 아래로 출력된다는것
마지막으로 for문 안에는 반복되지 않는건 쓰지 않아도 된다는것이다
하루에 자바 8시간 듣는다 운전하면서 코드가 생각나고
누워도 생각난다 좋은건가....?
'Java' 카테고리의 다른 글
자바 오버로딩, 생성자 (0) | 2024.04.13 |
---|---|
자바 이차원배열 (2) | 2024.01.25 |
자바 배열 (0) | 2024.01.15 |
자바 2438 별찍기.. (0) | 2024.01.09 |
자바 백준 2480번 (0) | 2024.01.08 |