국비학원에서 공부하고 문제 풀었던 내용들 블로그에 정리 중...
문제랑 문제풀이 방식 이런거 블로그에 적어도 되냐고 학원 강사님께 여쭤보고 허락도 받음
Math.random() 함수는?
(0<= x < 1) 의 double 타입 랜덤 실수를 생성하는 함수이다.
0~1 은 Math.random 기본 장착 범위이다.
나는 이 Math.random 함수가 0에서 1이라는 숫자를 보고 고등학교 수학에서 확률과 통계를 하다보면
확률은 0에서 1사이이고, 1은 될 수 없는 것을 떠올렸다.
어떻게 보면 전체 범위 중에서 하나가 나올 확률이 random 과 비슷해 보였기 때문이다.
이 랜덤 함수를 활용하여 원하는 범위의 숫자를 만들어 사용할 수 있다.
원하는 범위의 정수를 만드는 절차는 다음과 같다.
1. 생성된 랜덤 실수에 원하는 숫자의 개수를 곱하기
2. 1. 의 결과에다가 원하는 숫자 범위 중 가장 작은 숫자를 더하기
3. 소수점 아래를 삭제하기
예시)
1부터 45까지의 숫자를 랜덤으로 돌리고 싶다면?
(0 <= x < 1) 의 확률에서 1번을 적용하면
1부터 45까지 45개이니까 좌변, 우변에다 동시에 45를 곱하면 된다.
0 * 45 <= x < 1 * 45
2번을 적용하여 가장 작은 숫자 1을 더하면
1 <= x < 45 + 1 ( != 46, x는 46이 될 수 없고 45.99999999... 까지 가지게 된다. 여기서 소수점 아래를 모두 삭제)
3번으로 소수점 아래를 삭제하기인데 소수점 아래 삭제는 이 Math.random 함수가 double 타입이기 때문에
(int) 를 붙여 강제 타입캐스팅을 시키면 된다.
예제 1) 30부터 39까지의 랜덤 정수를 모두 출력
for (int i = 0; i < 10; ++i) {
System.out.println((int)(Math.random() * 10 + 30));
}
예제 2) 1부터 45까지의 랜덤 정수를 10개 출력
for (int i = 0; i < 10; i++) {
System.out.println((int)(Math.random() * 45 + 1));
}
보통 이렇게 쓰인다.
연습문제 난이도 ★
랜덤으로 생성된 두 숫자의 최대 공약수를 구해보세요 (범위 10~60),
연습문제를 풀어보자!
문제풀이의 이해 순서
1. 이 문제는 두 숫자를 먼저 생성을 한다.
그 다음 대충 변수에 담아놓고 계산을 유도하면 될듯 ㅇㅇ
2. 코드로 최대 공약수를 구하는 방법에 대해 생각해본다.
Hint)
2-1. 최대 공약수는 두 수의 공통된 약수 중 최대를 의미함
2-2. 그렇다면 첫번째 랜덤생성된 변수 a와 두번째 랜덤생성된 변수 b가 동시에 나머지가 0 인 상황이면 되지 않을까?
2-3. 특수한 상황을 가정하고 생각했는데 조건을 몇개 넣어서 유도하면 될 것 같다.
2-3-1. 유도 > 두 숫자는 a가 b보다 크거나 b가 a보다 크거나... 둘 중 하나일 것이다.
두 수 비교 중에서 작은 수보다 더 큰 수에서 공약수가 나올 수 있을까? 여기서 작은 수를 지정해주고 큰 수는 계산 하지 않는 방향으로 해서 불필요한 계산을 줄인다.
2-3-2. for문으로 비교용 변수를 하나 만들어서 작은수 값까지 숫자 하나하나 더해가면서 동시에 같이 나눠져서 나머지가 0이 되는 계산이 나오는 값이 공약수일 것이다. 이 과정이 for문으로 반복되며 대입 연산자를 이용해 연산이 끝나면 마지막에 계산된 약수가 최대 공약수가 나오도록 코드를 짜면 된다.
코드 작성 >
연습문제 난이도 ★★
4자리의 임시 번호를 만들어 출력하세요. (중복 허용, 들어갈 수 있는 문자는 숫자 0~9, 영어 소문자로 한함)
처음 볼땐 꽤 난감한 문제였다.
나도 학원에서 처음 풀었을 때 시간을 들여서 어쩌다가 풀었다.
이 문제의 이해는 이렇게 해야한다.
1. Math.random 으로 숫자와 영어 소문자를 4번 섞은걸 어디론가 내보내면 되겠다는 생각
2. 어디로 내보낼까? 임시 비밀번호 처럼, 그러니까 문자열처럼 보여야 하니까 문자열 변수를 생성하고 변수에 문자를 += 증감 연산자를 활용해 문자가 for문으로 한번씩 랜덤생성될 때마다 더해지는 구조로 만들면 되겠다 라는 생각
결과 코드는 다음과 같습니다.
출력 결과
String password = ""; 를 만들어줘서 비어있는 내용물을 가지고 있는 문자열 변수를 하나 만들어주고
password += 이걸로 문자를 하나씩 더해간다는 생각을 했다.
마지막으로 반복문이 종료되면 password가 완성이 될태고 그걸 그대로 출력을 하면 된다.
사실 학원에서 이 문제를 처음 접했을 때 이렇게 쉬운 문제로 끝나지 않았었는데...
원래 진짜 문제는
생성된 4자리 임시 비밀번호를 맞출때까지
모든 비밀번호를 생성하고 대조하는 프로그램을 만들어보세요
이거였다... 😅 딱봐도 고려해보일게 많아 보인다.
다음엔 이 문제 풀이를 작성하도록 해야지;; 코드 겨우 2주차인 나에겐 ㄹㅇ 어려웠음
학원을 병행하며 글을 쓰려니 쉽지 않다. ㅠ 다음에 뵙겠습니다! 😁
'Java (국비지원 당시 공부했던 글) > Java 프로그래밍' 카테고리의 다른 글
[JDBC] JDBC 란 무엇인가 (자바에서 DB연결해서 코딩하기), JDBC API 참조 (0) | 2022.07.17 |
---|---|
[자바] - 백준 10718, 10171, 10172번 풀이 (0) | 2022.06.06 |
[자바] - 백준 2557번 문제 풀이, BufferedWriter flush() 사용 이유 (0) | 2022.06.05 |
[자바] 무작위 숫자 생성 (2) - Random 클래스 (0) | 2022.04.26 |
제어구조(control structure) (0) | 2022.04.15 |