728x90
1. 임의의 수 만들기 : 난수 생성하기
- Math.random() : 0.0 과 1.0 사이의 임의의 double값을 반환
- 각 변에 내가 원하는 범위에 따른 숫자를 곱한다 ⇒ 이 부분은 내가 구하고자 하는 '개별값의 갯수' 라고 생각해도 됨
- 0 ~ 50까지 범위 안의 값을 구하기위해서는 *50 ⇒ Math.random()50, 이때 출력되는 값은 정확히는 0 이상 50 미만, 즉 0 ~ 49, 50 개의 수
- 0 ~ 3 까지 범위 안의 값을 구하기 위해서는 *3 ⇒ Math.random()**3, 이때 출력되는 값은 정확히는 0 이상 3미만, 즉 0 ~ 2, 3개의 수
- 이후 정수를 얻기 위해서는 실수를 int 형으로 형 변환이 필요하다.
- 만약 특정한 숫자부터 시작하고 싶다면, 해당 숫자를 더해주어야 한다.0.0 부터 1.0 사이의 임의의 실수를 발생시키기 때문에 특정한 범위를 지정해서 난수를 생성하기 위해서는 다음 순서에 따른다.
static void use_random() {
for(int i=1; i<=6; i++) {
System.out.println(Math.random()); // 0.0 <= x < 1.0
System.out.println(Math.random()*10); // 0.0 <= x < 10.0
System.out.println((int)(Math.random()*45)); // 0 <= x < 45, 0 ~ 44
System.out.println((int)(Math.random()*45)+1); // 1 <= x < 46 0 ~ 45 , 로또 번호 구하기
}
}
여기서 문제!! 만약 -5 ~ 5 사이의 임의의 값을 출력하기 위해서는 어떻게 하면 될까?
- 먼저 내가 -5 부터 5 사이에 정수가 몇개 있는지 파악한다 총 11개 숫자임으로 *11 ⇒ 이렇게해서 출력되는 수의 범위는 0 이상 11미만, 출력값은 0 ~ 10
- 다음으로 범위를 지정해야하는데 내가 원하는 범위는 -5 이상 5미만 임으로, 이에 맞게 -5 를 덧붙인다 ⇒ 최종적으로 범위는 -5 이상 6 미만, 출력값은 -5 ~ 5
// Quiz1. -5 ~ +5 까지 중 임의의 수
for(int i=1; i<=6; i++) {
System.out.println((int)(Math.random()*11)); // 0 <= x < 11 , 출력값은 0 ~ 10
System.out.println((int)(Math.random()*11)-5); // -5 <= x < 6, 출력값은 -5 ~ 5
}
2. 반복문 - for 문
- 반복 횟수를 아는 경우 사용!! - 조건을 만족하는 동안 블럭 {} 반복
- 반면 while 문은 반복 횟수를 잘 모르는 경우 사용 하는게 적합
- for 문 안에 변수 i 를 선언하는 경우 for문 밖에서는 i 사용 불가
- for 문 조건식에 2개 이상의 변수를 사용 가능한데, 이때는 두 개의 변수가 동일한 타입이여야함
for(초기화; 조건식; 증감식){
// 수행될 문장 => 조건이 만족하는 동안 문장 수행 후
// 증감 실행
// 조건식 거짓일 때 for 문 종료
}
#####################################
public static void main(String[] args) {
for(int i=1; i<=10; i+=2) { // i가 10 이하일때까지 i+2
System.out.println(i); // i = 1, 3, 5, 7, 9 => 11 일 때는 10보다 크기 때문에 실행X
System.out.println("Hello World");
}
}
결과 :
1
Hello World
3
Hello World
5
Hello World
7
Hello World
9
Hello World
#####################################
// for 문 안에 2개의 변수를 넣는 것도 가능
static void use_for2() {
// 단 이때 i 와 j 는 같은 타입이여야 함
for(int i=1, j=10; i<=10; i++, j--) {
System.out.println("i = "+i);
System.out.println("j = "+j);
}
}
3. 중첩 for문 사용하기
- 중첩 for문의 대표 문제는 구구단 출력하기!
- 중첩 for 문의 바깥쪽 for 문은 세로의 크기 = row = y값이고, 안쪽 for 문은 가로의 크기 = col = x 값이다.
- 중첩 for 문 생성 시 new int[row][col] 이라고 생각하면 보다 쉽다. 따라서 수학에서의 좌표평면 즉 함수로 읽는 경우 (y,x) 이라는 것에 주의해야한다!! -> 매우 헷갈린다
static void gugudan() {
for(int i=2; i<=9; i++) { // 2단부터 시작!
for(int j=1; j<=9; j++) { // i * 9 까지 출력
System.out.println(i+" * "+j+" = "+i*j);
}
System.out.println(); // 한번 출력이 끝나고 한줄 띄우기
}
}
대표 문제 2 : 별 찍기 && 별 찍기 응용
**********
**********
**********
**********
**********
####### 위처럼 출력하는 코드는? ##########
static void star() {
for(int i=1; i<=5; i++) {
for(int j=1; j<=10; j++) {
System.out.print("*");
}
System.out.println();
}
}
################# 별찍기 응용 : 직각 삼각형 출력 ###########
static void star_1() {
for(int y=1; y<=3; y++) { // y 값은 증가하는 모양 => 1 2 3
for(int x=1; x<=y; x++) { // x 값은 증가하는 모양 => 1 2 3
// 즉 1 1 좌표일때는
System.out.print("*");
}
System.out.println(); // 출바꿈 only
}
}
static void star_2() {
for(int y=3; y>=1; y--) {
for(int x=1; x<=y; x++) {
System.out.print("*");
}
System.out.println();
}
}
########### 결과 ###########
*
**
***
***
**
*
- 대표 문제 3 : 별 찍기 오른쪽 정렬
- 얘는 for문을 여러번 써서 출력가능!
- 중요한 점은 빈칸의 증가와 * 의 감소를 for문으로 적절하게 구현하는 것
static void star_4() {
for(int i=1; i<=6; i++) { // 아래 2개의 for문이 전체 몇번 반복되는지
for(int a=6; a>=i; a--) { // 빈칸은 점차 감소함
System.out.print(" ");
}
for(int j=1; j<=i; j++) { // * 은 점차 증가함
System.out.print("*");
}
System.out.println();
}
}
########### 결과 ###########
*
**
***
****
*****
******
4. while : 한번도 반복 안될 수도 있음
조건을 만족시키는 동안 블럭 {} 반복 - 반복횟수 모를 때
while(조건식){
// 조건식의 연산결과가 참(true)인 동안 반복될 문장들을 적는다
}
#########################
public static void main(String[] args) {
int i=5; // 반복할 횟수 넣기
while(i!=0) {
i--; // 1씩 줄어듦
System.out.println(i + " - I can do it? ");
// 0 까지 찍히는 이유는 i가 1일때 i-- 하여 줄어든 0이 출력되고,
// 그 후 0 일 때 조건식 0!=0 이 거짓처리됨으로 결국 0 까지만 출력됨
}
System.out.println("끝 : "+ i);
}
활용 문제 : 원하는 숫자 입력 후 각 자리숫 모두 더하기
- 처음에는 while 문을 이용해서 출력해보았다(buffer 사용)
- 다음은 동일한 문제를 for 문을 이용해서 출력해보았다(buffer 사용)
- 마지막으로 String 이 아닌 int 형으로 바로 변환하여 출력하는 방법으로 풀어보았다.
- 이 방법에서 사용되는 방법은 특정한 수를 10씩 나눠가면서 나머지 값을 구하면 각 자리수를 알 수 있다는 점이다.
- ex) 12345 일 때, 10씩 나눠가면 12345 → 1234 → 123 → 12 → 1, 이때 나머지 값들을 구하면 각 자리수를 알 수 있다.
static void while_3() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int sum = 0; // 초기값 설정
int i = 0;
String str = br.readLine(); // 입력받기
String[] result = str.split(""); // String 으로 입력받은 값을 그대로 하나하나 자름
while(i<result.length) { // String 을 배열로 만들어서 배열의 길이만큼 while 문 실행
sum+=Integer.parseInt(result[i]); // sum 에 배열의 각 자리수를 int 로 형변환 후 더하기
bw.write("합계 : "+sum+"\n"); // 출력
i++; // i 값 증가
}
br.close();
bw.write("### 최종 합계 : "+sum +" ###");
bw.flush();
bw.close();
}
############## for문 이용 ###################
static void for_1() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int sum = 0;
String str = br.readLine();
String[] result = str.split("");
for(int i=0; i<result.length; i++) { // 여기만 for 문으로 변경
sum+=Integer.parseInt(result[i]);
bw.write("합계 : "+sum+"\n");
}
br.close();
bw.write("### 최종 합계 : "+sum +" ###");
bw.flush();
bw.close();
}
############### for문 이용 + 다른방법 ############
static void for_2() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int sum = 0;
String str = br.readLine();
int num = Integer.parseInt(str);
for(int i=num; i>0; i = i/10 ) {
// 즉 어떤 수에 10씩 나눠가면 한 자리씩 점점 줄일 수 있음
// ex) num = 12345 일때 -> 12345, 1234, 123, 12, 1
// 이후 %10 연산하면 각 자리수를 구할 수 있음
bw.write("각 자리수 구하기 위해서는 %10 : "+i%10+"\n");
sum+=i%10;
bw.write("sum 값 : "+sum +"\n");
}
br.close();
bw.write("### 최종 합계 : "+sum +" ###");
bw.flush();
bw.close();
}
5. do ~ while 문 : 최소 1번은 무조건 실행됨
블럭 {} 를 최소한 한 번 이상 반복 - 사용자 입력 받을 때 유용
do {
// 조건식의 연산 겨로가가 참일때 수행될 문장들을 적는다(처음 한번은 무조건 실행)
}while(조건식);
활용 문제 : 랜덤한 숫자 맞추기!!
static void dowhile_1() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int answer = 0;
int num = 0;
answer = (int)((Math.random()*100)+1); // 1 <= answer < 101
do {
System.out.print("나의 숫자를 맞춰봐! : ");
num = Integer.parseInt(br.readLine());
if(answer > num) {
System.out.println("숫자가 너무 작아요");
}else if(answer < num){
System.out.println("숫자가 너무 커요");
}
}while(answer!=num); // 여기에 != 가 들어가는 이유는 answer 과 num 이 서로 다른동안 while 문이 돌아야하기 때문에
bw.write("정답입니다 연금술사!");
br.close();
bw.flush();
bw.close();
'Java - 기본기' 카테고리의 다른 글
9. 배열 다루기 기초편 (1) : 배열의 생성, 선언, 인덱스 (0) | 2021.10.08 |
---|---|
8. 조건문과 반복문 기초&활용(3) - break, contiune, 이름붙은 반복문(feat. 미니 게임 만들기 & 제곱근, 로그 계산기) (0) | 2021.10.04 |
6. 조건문과 반복문 기초&활용 (1) (0) | 2021.09.27 |
Java 입출력(I/O), 스트림(Stream), 버퍼(Buffer) 개념 및 사용법 (2) | 2021.09.26 |
5. 반올림-Math.round(), 비교, 조건, 논리, 대입, 복합 대입 연산자 (0) | 2021.09.16 |
댓글