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

자바 기본 프로그래밍 12 - 단원 마무리 실습편 틀린 문제 다시 풀기 + 새로운 문제 추가 학습 본문

프로그래밍 언어/자바

자바 기본 프로그래밍 12 - 단원 마무리 실습편 틀린 문제 다시 풀기 + 새로운 문제 추가 학습

huenuri 2024. 8. 10. 14:40

이어서 이번에는 실습편 문제에 도전해본다. 어제는 홀수의 문제만 나와 있어서 정답을 맞추었는지 확인이 어려웠다. 오늘은 맞은 문제도 다시 보면서 어떤 코드가 더 간결한지 보면서 코드도 수정해보려고 한다.
문제를 맞추는 것이 능사가 아니라 개발자는 보기에 이해하기 쉽고 간결한 문장으로 만들 수 있어야 한다. 반복은 가능하면 줄이고 더 간단한 방법이 있으면 그걸 사용하는 것이다.

이제 문제를 풀어보자!


 

 

 

연습문제 실습편 틀린문제 다시 풀기

 

문제 2번

Scanner 클래스를 이용하여 2자리의 정수(10 ~ 99사이)를 입력받고, 십의 자리와 일의 자리가 같은지 판별하여 출력하는 프로그램을 작성하라.

이 문제는 틀리지 않았으나 조건을 한 가지만 써서 else를 하나 추가해주면 좋을 것 같다. 그리고 조건을 복잡하게 연산으로 쓰지 않고, 변수를 하나 만들면 더 간결해지는 걸 알게 되었다.

 

 


 

 

 

문제 3번

Scanner 클래스를 이용하여 정수로 된 돈의 액수를 입력받아 오만 원권, 만 원권, 천 원권, 500원 짜리 동전, 50원 짜리 동전, 10원 짜리 동전, 1원 짜리 동전 각 몇개로 변환되는지를 출력하라.

이 문제는 대단히 어려웠는데 선생님이 수업시간에 설명한 문제를 하나 푸는 게 더 좋을 것 같다. 소리는 들리지 않지만 코드만 보면서 한번 분석해볼 것이다.


 

비슷한 예제 문제 풀어보기

 

자판기 프로그램을 만들어보았다.

 

먼저 입출력문을 작성한다. 어떤 메뉴인지 파악을 해야 하니까.

 

 

 

해당 메뉴 번호를 선택했을 때 돈이 부족한 상태와 충분한 상태로 나누어서 거스름돈을 계산한다.

 

 

 

그런 다음 출력을 해주면 된다. 어제 이 문제를 보았을 때는 너무 어려워서 손도 못댔는데 오늘 다시 보니 이 문제가 매우 쉽게 느껴졌다. 정말 이상한 일이다. 어제 어려운 연습문제를 몇 개 풀었더니 내 프로그래밍 실력이 한뼘 자란 모양이다.

 


 

본 문제 다시 풀어보기

정말 어려운 문제였고 어제는 거의 이해를 못하고 넘어갔었다. 근데 오늘 다시 보니 충분히 풀 수 있었다. 책의 해설에는 돈의 지표를 상수로 선언했는데 이렇게 하면 줄 수만 많아지고 길어지는 것 같아서 모두 0으로 초기화했다.

 

 

코드가 좀 길다. 돈의 지표보다 크면 그 값으로 나누어서 개수를 담아준다. 그리고 이 개수를 실제 돈에 넣어주어야 한다. 처음에는 이 과정을 생략했더니 거스름돈이 모두 0매가 되었다.

 

 

오늘 파이썬 수업 시간이 이런 비슷한 문제를 풀었는데, 새벽에 공부한 것이 큰 도움이 되었다. 다 이해하지는 못했지만 기초 공부를 하고 수업을 들으면 확실히 알아듣는 것들이 많아진다.


 

 

 

4번 문제

나와는 좀 다른 방식으로 푼 것 같아 이 풀이로 코드를 짜보기로 했다. 난 삼각형이 안 되는 경우를 먼저 찾아서 그 나머지는 삼각형이 되는 조건이 되도록 했다.
다른 방법으로는 가장 긴 것을 max로 넣고 값을 하나씩 찾아갈 수도 있다.

 

 

참고한 코드가 조금 잘못된 부분이 있는 것 같아서 바꾸어주었다. b와 c를 x, y에 담아주었으니 조건문에서 max < x, max < y가 되어야 할 것 같다.

 


 

 

 

6번 문제

이 문제는 정말 어려워서 해결을 못했었다. 난 엄청 복잡하게 생각했는데 중첩문을 쓰면 되는 거였다.

 

 

또 내가 생각하지 못했던 부분은 숫자가 한 자리수가 될 경우였다. 이때도 조건문을 사용해서 꼭 만들어줘야 한다. 그래도 어느 정도 정답에 가까이 갈 수 있어서 정말 기뻤다.
전에라면 이런 문제는 손도 못댓을 것 같다.

 


 

수정한 코드

 

근데 문제가 있다. 분명 3의 배수가 아닌 한 자리수를 입력했는데 박수짝짝이 되는 것이다. else 조건으로 박수를 치지 않는다는 것도 만들었으나 이 부분이 적용이 되지 않는 것 같다.
이 문제는 지금으로서는 해결 불가능이다. 아무튼 넘어가기로 하자. 이 사람도 코드가 좀 틀리는 게 좀 있는것 같다.


 

 

 

8번 문제

2차원 평면에서 직사각형은 문제 7번처럼 두 점으로 표현된다. 키보드로부터 직사각형을 구성하는 두 점 (x1, y1), (x2, y2)를 입력받아 (100, 100), (200, 200)의 두 점으로 이루어진 직사각형과 충돌하는지 판별하는 프로그램을 작성하라.

이 문제는 함수를 하는 거라 아직 배우지 않은 개념이 등장한다. 그래도 조건식을 사용하는 중요한 예제이니 다시 한번 풀어보았다. 진짜 풀리지 않는 문제는 정답을 보면서라도 코드을 읽고 해석하는 것이 중요하다.
전에는 이런 코드를 보면 잘 이해하지 못했는데 요즘은 그래도 왠만한 코드를 볼 수 있게 되었다.

 

 

매개변수로 6개를 받는다. 그 중에 4개는 입력을 위한 x축, y축 매개변수이고, 다른 2개는 x, y의 축을 조사하는 매개변수이다.
100과 200 사이에 있으면 충돌하고 그 외의 경우에는 충돌하지 않는 것으로 설정한다.

 

 

정말 어려운 문제였는데 이제 대부분 이해했다. 다음에는 혼자서도 풀 수 있도록 연습해야겠다~


 

 

 

9번 문제

원의 중심을 나타내는 한 점과 반지름을 실수 값으로 입력받아라. 그리고 실수 값으로 다른 점 (x, y)를 입력받아 이 점이 원의 내부에 있는지를 판별하여 출력하라.

 

 

 

 

이 문제 역시 상당히 어려웠는데 코드를 이해하는데 중점을 두었다. 생전 처음 들어보는 수학 함수를 사용해야 했다. 지금은 이런 함수가 있구나 하고 알아두고, 다음에 더 깊이있는 학습을 진행해볼 것이다. 그래도 코드는 거의 완전히 이해했다.


 

 

 

10번 문제

원의 정보를 받기 위해 키보드로부터 원의 중심을 나타내는 한 점과 반지름을 입력받는다. 두 개의 원을 입력받고 두 원이 서로 겹치는지를 판단하여 출력하라.

 

 

 

 

9번 문제와 비슷해서 별로 어렵지 않게 풀 수 있었다. 근데 길이를 어떻게 표현할지 잘 파악해야 한다. 이 부분은 잘 몰라서 참고하며 코드를 작성해보았다.


 

 

 

11번 문제

이제 고지가 얼마 남지 않았다. 조금만 더 힘을 내서 문제를 풀어보자! 시간이 많이 걸려도 완전히 이해하고 넘어가야 다음 단원에서도 비슷한 유형의 문제를 풀 수 있다.

숫자를 입력받아 3 ~ 5는 "봄, 6 ~ 8은 "여름", 9 ~ 11은 "가을, 12, 1, 2의 경우 "겨울"을, 그 외 숫자를 입력한 경우 "잘못입력"을 출력하는 프로그램을 작성하라.

 

1) if 문으로 풀기

 

몫과 나머지를 사용해서 구했는데, 범위를 지정해줄 수도 있었다. 근데 기렇게 하면 코드가 좀더 길어진다. 처음 생각하기가 좀 어렵지 난 이 코드가 더 마음에 든다.


 

2) switch 문으로 풀기

이렇게 2가지 유형으로 문제를 모두 풀어보았다. 혼자서 해결했다는데 정말 뿌듯함을 느꼈다. 비록 30분 이상 걸리기는 했지만 말이다.


 

 

 

12번 문제

사칙 연산을 입력받아 계산하는 프로그램을 작성하고자 한다. 연산자는 +, =, *, /의 네 가지로 하고 피연산자는 모두 실수로 한다. 피연산자와 연산자는 실행 사례와 같이 빈칸으로 분리하여 입력한다. 0으로 나누기 시 "0으로 나눌 수 없습니다."를 출력하고 종료한다.

 

1) if-else문 사용하기

 

 

 

처음에는 -인줄 알았는데 =이었다. 다시 수정해서 풀어보았다.


 

 

2) switch문 사용하기

 

 

 

공백을 띄지 않으면 애러가 난다.

 

이제 계산기를 만드는 것도 어느정도 자신이 있다. 자바에서는 문자를 조건에 따라 정해줄 때 equals 함수를 활용해야 한다. 이 부분이 조금 어려웠다. 그래도 모든 문제를 다 풀 수 있어서 정말 기뻤다!


 

 

 

학습을 마치고

오늘 연습문제만 푸는데 5시간이나 걸렸다. 1시간 반은 이론편 틀린 문제를, 3시간 반은 실습편 12문제를 풀었다. 한 문제에 2문제씩 배정되어 있는 문제들도 여럿 있어서 오랜 시간이 걸린 것 같다.
그래도 완벽하게 다 풀길 정말 잘했다는 생각이 들었다. 여기서 완전히 숙지하지 못하면 다음 장에 있을 연습문제도 늘 어려울 것이다.

이제 반복문 학습을 시작해도 될 것 같다. 이번주 평일내내 조건문 학습을 이어갔다. 일주일 가까이 했는데 겨우 chapter 2까지밖에 진도를 빼지 못해서 참 아쉬웠다. 그래도 이제 자바를 제법 쓸 수 있게 되었음에 만족한다. 어렵다고 생각하는 문제도 차근차근 코드를 따라가보면 분명 풀 수 있음을 느꼈다. 문제를 이해하는 것이 문제 풀이의 절반 이상을 차지한다.
어떻게 풀어야할지 잘 모를 때는 주석을 달면서 한 단계씩 밟아나가다보면 어느새 정답에 다다른다는 걸 알게 되었다~