클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

반복문과 배열 그리고 예외 처리 4 - 이중 for문 본문

프로그래밍 언어/자바

반복문과 배열 그리고 예외 처리 4 - 이중 for문

huenuri 2024. 8. 11. 02:58

며칠만에 자바 본 학습을 시작해보는 것 같다. 밤 12시가 거의 다 되었지만 오늘은 평소보다 조금 늦게까지 공부를 진행해보려고 한다. 이번주에는 계속 놀기만 하느라(수업만 듣는 정도) 집에서 공부를 해본 적이 거의 없었다.
적어도 오늘 새벽 2시 반까지는 공부를 해야 주말에 목표한 분량을 마칠 수 있을 것 같다.

지난번에 2주를 간신히 넘기는 공부 기록을 세웠던 적이 있는데 이번에는 앞으로 팀 프로젝트를 마치는 4주 동안 주말은 없다 생각하고 공부에 열중해보려고 한다.
생각해보면 주말에 놀지 않고 공부 외에 딴 생각이 들어있지 않았을 때는 수업도 공부도 재미있고 일상생활도 나름 잘 보냈던 것 같다. 이제 진짜 몰입을 해볼 시점이 되었다. 한 달 후를 기대하며 지금의 시간을 알차게 보내기로 다짐해본다!

 

학습 목표

  1. 이중 for문을 이용한 문제를 풀어보며 for문을 사용하는 것에 익숙해진다.
  2. 여러가지 문제를 풀어보며 응용력을 기른다.

학습 시간

전날 밤 11시 반 ~ 1시 반
다음날 새벽 6시 반 ~ 7시 반 <총 3시간 소요>


 

 

 

이중 for문


 

 

예제 1번 문제

 

j 값은 밖에 있으니 안에 있는 i부터 그 값이 하나씩 올라가는 것을 볼 수 있다. i가 3이 되어 더이상 증가할 게 없으면 그때 j값이 1 증가한다.


 

 

 

예제 2번 문제


 

1단계 : 모든 문장 출력하기


 

 

 

2단계 : 2~4단 for문으로 감싸 만들기

 

선생님의 설명을 듣기 전에 혼자서 문제를 풀어보려고 노력했다. 전에 C와 C++ 공부할 때 분명히 공부했던 부분인데 다시 하려니 많이 헤깔렸다. 왜 i와 j가 있는지 거꾸로 하면 안되는지 등등 의문사항이 이어졌다.
여전히 이중 for문은 많이 어렵다.


 

 

 

3단계 : 모든 구구단 출력

 

탭을 사용하면 1을 곱한 다음에 칸이 많이 띄어진다. 이때 ~단의 문장을 삭제하면 이러한 문제가 해결된다. " "을 사용해보았으나 줄이 정렬이 되지 않아 탭을 사용하는 것이 더 나았다.


 

 

 

예제 3번 문제


 

 

1단계 : 2의 약수 구하기

 

이제 반복되는 코드를 for문으로 감싸준다.

 


 

2단계 : 2과 3의 약수 구하기


 

2~30까지의 약수 구하기

 

2와 3의 약수를 구하니 30까지의 약수를 구하는 건 별로 어렵지 않았다. 영상을 끄고 혼자서 한번 풀어보았다.


 

 

 

예제 4번 문제


 

 

1단계 : 그냥 별 5개 찍기


 

 

2단계 : 하나씩 늘어나는 별 5개 찍기

 

이 모양이 한번에 나오지 않아서 한 10번의 시도 끝에 만들어보았다. i와 j의 초기값을 0과 1로 바꾸어보았는데 그렇게 할때 별이 3개나 4개만 찍혔다.
마지막에 j가 5일때까지 증가시킨다는 조건으로 했더니 5개가 잘 찍혔다. 그래야 i는 5보다 작은 0~4까지의 별 다섯개를 찍게 되기 때문이다.


 

 

 

 

예제 5번 문제


 

 

1단계 : 별이 줄어드는 삼각형 만들기


 


2단계 : 행을 받아 출력하는 별 모양 만들기

 

입력받은 것보다 언제나 한 줄이 적어 1을 추가해주었다.

 

 

별 찍기 문제는 전에 코딩테스트 문제를 풀때 수없이 연습해보았다. 요즘 이런 문제를 풀지 않았더니 처음에는 어떻게 풀지 좀 막막하기도 했으나, 몇번 풀어보니 그때보다 더 이해력이 높아진 것 같다.

다음은 continue와 break문에 대한 복습을 해보자!


 

 

 

continue 문과 break 문

 

continue 문

반복문을 빠져나가지 않으면서 즉시 다음 반복으로 넘어가고자 할 때 사용된다. continue는 실행 경로를 변경한다.

 

예제 3-5번 : continue 문을 이용하여 양수 합 구하기

5개의 정수를 입력 받고 그중 양수들만 합하여 출력하는 프로그램을 작성하라. 입력된 수가 0이나 음수이면 continue문을 이용하여 합하지 않고 다음 반복으로 넘어간다.

 


 

 

break 문

 

현재의 반복문을 벗어나 실행이 계속된다.

 

예제 3-6번 : break 문을 이용하여 while 문 벗어나기

"exit"이 입력되면 while문을 벗어나도록 break 문을 활용하는 프로그램을 작성하라.

 

 

이 문제를 풀다가 어젯밤 너무 졸려서 취침하였다. 그래도 어제는 밤에 3시간은 공부를 한 것 같다. 비록 진도는 얼마 나가지 못했지만..

 


 

 

 

check 문제 풀기

 

문제 1번


 

 

for 문

 

어제 분명히 이 문제를 풀었는데 혼자서 풀려니 도무지 풀리지 않는다. 아직 난 이중 for문을 이해하지 못한 것 같다.
앞부분을 다시 한번 참고하며 문제를 풀어보았다.

 

초기값을 다르게 설정하니 별이 찍혔다.


 

 

 

while 문

 

이 문제는 도저히는 혼자서는 풀 수 없어서 정답을 보면서 풀었다. while문으로 중첩하는 건 처음 해본다. for문 뿐 아니라 이렇게 사용할 수 있다는 것도 알게 되었다.

 


 

 

do-while 문

do-while 문은 별로 어렵지 않았다. while문에 do만 넣어주면 되는 거였다.


 

문제 2번

 

계속 무한반복이 된다. 이클립스에서는 중지를 눌러도 잘 안되는 경우가 많아서 창을 닫고 새로 시작해야 했다. 건강한 프로그램을 위해 가능하면 무한반복은 사용하지 않는 것이 좋겠다.

 


 

문제 3번

 

1부터 100까지 3의 배수의 합을 구하는 문제인데 이렇게 간단한 문제도 풀지 못하는 자신이 한심스러웠다. 한참을 고민해도 풀리지 않았다.

 

 

도대체 그동안 C#, C, C++에서 수없이 연습을 했는데 내 공부가 되지 못했나보다. 값이 나타나는 게 아니라 곱하기한 값이 그대로 출력되고 있었다.


 

 

 

다시 풀어보기

 

비슷하게 근접했으나 간과한 사실이 있었다. sum을 for문 안쪽에 쓰니 계속 이 값을 불러와서 곱한 값만 나왔던 것이다. 밖에 써야 합계가 구해진다. 그리고 3의 배수는 100에서 33번만 곱해지니 33을 써야 한다고 생각했는데 아니었다. 그냥 100까지를 더하는 거였다. 너무 깊게 생각했나보다.
33까지 하면 561이라는 다른 값이 나온다.


 

 

 

학습을 마치고

어젯밤에 다 마치고 싶었는데 오늘 일어나서도 1시간은 더 학습해야 할 분량이었다. 이중 for문은 평소에도 많이 어려워하던 부분이라 지금도 잘 되지 않는 부분이 많았다.
손코딩을 하며 어떻게 수가 들어가는지 자세히 학습해볼 수 있을 것 같다.

오늘은 공부해야 할 것이 정말 많다. 지난 2주처럼 토요일에 놀지 않고 처음 2주처럼 앞으로 한 달 동안은 쉬지 않고 공부를 해볼 생각이다. 사실 일과 놀이의 경계는 분간이 되지 않을 때 자기 일에 몰두하는 사람이 되는 것 같다.