2024-12-30 오늘도 반복문이지만, 이번에는 for문이다.
while과 for의 차이점을 말하자면 while은 단발성 반복문, for문은 다중 반복문이라고 생각하면 된다.
쉽게 말하자면 while은 계속 반복해!! 이런 느낌이고 for문은 여기서 여기까지 반복해!! 이런 느낌이라고 보면 된다.
//for문 예시
for(초기식:조건식:증감식){
수행할 문장;
}
코딩할 때 Pseudo 코딩을 한 번 해보고 진행하는게 나음. 감으로 하는 것보다 이 습관을 들이면 새로운 문제를 직면하더라도 풀어낼 수 있음. 감으로 진행하게 되면 새로운 문제가 어려울 수 있음. Pseudo 코딩은 한글로 적고 한 번 하라는 뜻
예시
if(소수인 것만 출력){
sysout(i);
}
문제 풀기
1. a부터 b까지 정수의 합을 출력(a와 b는 랜덤)
package day003.class01;
import java.util.Random;
public class Test03 {
public static void main(String[] args) {
Random random = new Random();
//a와 b 모두 1~10까지 랜덤으로 지정
//random.nextInt()는 0부터 index가 시작해서
//1~10까지 랜덤으로 뽑을 생각이기에 +1 더해줌
int a = random.nextInt(10) + 1;
int b = random.nextInt(10) + 1;
// a가 b보다 큰 경우 두 수 정렬
int start = Math.min(a, b); //start는 a,b 중에 더 작은 값
int end = Math.max(a, b); //end는 a,b 중에 더 큰 값
// 합계를 0으로 초기화
int sum=0;
//반복문
for(int i=start; i <= end; i++){
sum += i;
}
// 합계 출력
System.out.println("a값 : " + a + " b값 : " + b);
System.out.println("합계" + sum);
}
}

start 값을 a,b 중에 더 작은 값을 Math.min(a, b)를 통해 지정해주고, end 값을 a,b 중에 더 큰 값을 Math.max(a,b)를 통해 지정해준다. 이후 합계 sum 값을 0으로 초기화 해주고 sum값에 0부터 start값을 더하고 반복문 1 사이클이 끝나면 다시 start 값을 1 더해주고 sum 값에 더해줘서 반복. start 값은 end 값까지 반복하면 된다. 이후 합계 값을 출력하면 결과가 나온다.
2. 10의 약수를 전부 출력하면서 약수의 개수가 몇개인지도 함께 출력
package day003.class01;
public class Test04 {
public static void main(String[] args) {
// 카운트 초기화
int count = 0;
System.out.print("10의 약수 : ");
// 10을 i로 나눴을 때 나머지가 0이 되는 것 출력
for(int i = 1; i <= 10; i++) {
if(10 % i == 0) {
System.out.print(i + " ");
count++;
}
}
// 10의 약수의 개수를 출력하는데 count가 몇 번 반복됐는지 출력
System.out.println("\n10의 약수의 개수 : " + count);
}
}

약수는 a를 b로 나눴을 때 나머지 값이 0이 되는거를 의미하기에 10 % i == 0 이라는 코드를 사용했습니다. 디버깅표를 확인해보면 나머지 값이 0이 될 때 count 값이 상승되도록 코드를 설계했고 이후 10의 약수의 개수를 출력하기 위해 sysout(count)를 해 결과값을 냈습니다.
1. 소수란, 약수의 개수가 1과 자기자신뿐(2개)인 수를 말한다. 랜덤정수(0~100 사이)가 소수라면 "소수입니다." 소수가 아니라면 "소수가 아닙니다."를 출력해주세요.
package day003.class03;
import java.util.Random;
public class Test01 {
public static void main(String[] args) {
//소수는 1과 자기자신이 곱했을 때 나오는거
//반대로 약수가 1과 자기자신만 나오는 것
Random random = new Random(); // random 객체 생성
//1~100까지 범위 지정
int a = random.nextInt(100) + 1;
int count = 0;
//1부터 랜덤으로 정해진 a까지 상승할 때 a를 i로 나누고 나머지 값이 0이 될 때 카운트
for(int i=1; i<=a; i++){
if(a % i == 0){
count++;
}
}
if(count==2){ //소수이므로 약수의 개수가 2개인 것만 소수로 분류
System.out.println("숫자" + a + "은(는) 소수입니다.");
} else { //2가 아닌 것은 소수가 아님
System.out.println("숫자" + a + "은(는) 소수가 아닙니다.");
}
}
}

a를 i로 나누었을 때 나머지가 0인 것을 count 한다. 이때 카운트 반복이 끝나고 카운트 값이 2에 해당하면 그 숫자는 소수이고 아니면 소수가 아니다.
2. 1부터 50까지의 정수중에서 소수들을 출력해주세요.
package day003.class03;
public class Test02 {
public static void main(String[] args) {
for(int i = 1; i<=50; i++){ //1부터 50 숫자 1씩 증가
int count=0; //카운트 0으로 초기화
for(int j=1; j<=i; j++){
if(i % j ==0){ //i를 j로 나눴을 때 나머지가 0이 되는 수가 발견되면 카운트 증가
count++;
}
}
if(count==2){ //약수가 1과 자신뿐인 숫자를 찾기 위해 카운트가 2개인 수를 찾는다.
System.out.println("소수" + i);
}
}
}
}

i를 j로 나누었을 때 나머지가 0이라면 약수이다. 이때 약수가 2개인 것을 구하면 해당 숫자는 소수이고, 아니라면 소수가 아니다.
3. 1부터 50까지의 정수중에서 6의 배수들을 모두 출력하고 이들의 총합을 출력해주세요.
package day003.class03;
public class Test03 {
public static void main(String[] args) {
for(int i=1; i<=50; i++){
//i / 6 했을 때 나머지가 0인 걸 찾아라
if(i % 6 == 0){
System.out.println("6의 배수 : " + i);
}
}
}
}

i는 1씩 증가하는데 증가할 때마다 6을 나누고 나머지가 0이 되는 것을 찾는다. 그 이후 반복문이 다 끝나고 해당수를 확인해보면 6의 배수를 찾을 수 있다.
4. 완전수란, 약수를 모두 더했을 때 자기자신이 되는 수를 말합니다. 랜덤정수(0~1000사이)가 완전수라면 "완전수입니다." 아니라면 "완전수가 아닙니다."를 출력해주세요.
package day003.class03;
import java.util.Random;
public class Test04 {
public static void main(String[] args) {
// 완전수를 구하려면 약수를 모두 더한게 완전수여야 함.
// 그러면 예를 들어서 10을 i로 나누면 0이 되는 그때 i를 모아둔다.
// i를 모두 더하고 랜덤한 정수가 맞다면 그걸 맞다고 출력 아니면 아니라고 출력
Random random = new Random(); //random 객체 생성
int a = random.nextInt(1000) + 1; //0부터 999까지 형성돼서 1을 더해줘야 1~1000임
int sum = 0; //합계 초기화
for(int i=1; i<a; i++){ //1부터 a까지 1씩 상승
if(a % i == 0){ //a를 i로 나눴을 때 몫이 0이면
sum += i; //sum에다가 i를 더해준다.
}
}
System.out.println("숫자 : " + a + "는");
if(sum == a){ //합계가 a와 같으면 완전수
System.out.println("완전수입니다.");
} else { //합계가 a와 다르면 완전수가 아님
System.out.println("완전수가 아닙니다.");
}
}
}

본인을 제외한 약수들을 모두 더했을 때 완전수라고 하는데 a를 6으로 잡고 진행했을 때 약수는 1,2,3이 나온다. 이 1,2,3을 모두 더하면 6이 나오는데 이때 완전수라고 출력하게 설계해봤다. 약수 구하는거는 전에 했던 것처럼 a를 i로 나누었을 때 나머지가 0이면 그 i값을 약수라고 계산한다.
5. 1부터 1000까지의 정수들중에서 완전수들을 출력해주세요.
package day003.class03;
public class Test05 {
public static void main(String[] args) {
//1부터 1000까지 1씩 상승 시키고
//그 값의 약수를 구한다
//약수가 모두 더해졌을 때 그 값과 같다면
//그 수들을 모두 출력한다.
for(int i=1; i<=1000; i++){ //1부터 1000까지 1씩 증가
int sum=0; // 합계 0으로 초기화
for(int j=1; j<=i/2; j++){ //j는 i의 절반, 이유는 본인을 제외한 약수 중 가장 큰거는 절반이기 때문
if(i % j == 0 ){ //i를 j로 나눴을 때 나머지가 0인 것을 구함
sum += j; //구한 j값을 sum = sum + j를 반복
}
}
if(sum == i){ // 합계가 i와 같은 것
System.out.println("완전수는 " + sum + " 입니다"); //sum값 출력
}
}
}
}

디버깅표를 참고해서 i와 j는 1씩 증가합니다. 이때 6을 보면 약수 1,2,3은 모두 나머지가 0이고 더했을 때 값이 6이 되므로 6은 완전수이다.
Scanner
지금까지 출력을 공부했다면 Scanner는 입력에 해당하는 문법이다.
Scanner sc = new Scanner(System.in);
Scanner 객체는 이와 같이 선언하면 된다.
package day003.class03;
import java.util.Scanner;
// 정수를 두개 입력해서
// 더 큰 정수를 출력해주세요.
public class Test07 {
public static void main(String[] args) {
int a;
int b;
Scanner sc = new Scanner(System.in);
System.out.print("정수를 입력해주세요 : ");
a=sc.nextInt();
System.out.print("정수를 입력해주세요 : ");
b=sc.nextInt();
System.out.print("더 큰 수 : ");
if(a>b){
System.out.println(a);
System.out.println(a + "가 " + b + "보다 더 " + (a-b) + "만큼 더 큽니다.");
} else{
System.out.print(b);
System.out.println(b + "가" + a + "보다 더 " + (b-a) + "만큼 더 큽니다");
}
}
}
package day003.class04;
import java.util.Scanner;
//정수 3개를 입력하고 3개의 합과 평균을 출력하세요
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //scanner 객체 생성
System.out.println("1번째 숫자를 입력해주세요 : ");
int a = scanner.nextInt();//숫자 입력 받기
System.out.println("2번째 숫자를 입력해주세요 : ");
int b = scanner.nextInt();//숫자 입력 받기
System.out.println("3번째 숫자를 입력해주세요 : ");
int c = scanner.nextInt();//숫자 입력 받기
int sum = a + b + c; // 총합은 a,b,c를 모두 더한 것
//명시적 형변환
//double avg = (double)(a + b+ c) / 3; //평균은 a,b,c를 더하고 3개를 나눈 것. (double)을 통해 정수를 실수화
//명시적 형변환은 메모리에 타격이 갈 수 있어 묵시적 형변환을 추천함
double avg = sum/3.0; //묵시적 형변환(.0을 붙이는거를 묵시적 형변환이라고 함)
System.out.println("합 : " + sum);
System.out.println("평균 : " + avg);
}
}
Random 객체
random 객체는 숫자를 랜덤으로 정의해주는 도구이다.
Random random = new Random();
위와 같이 정의하고 int a = random.nextInt(10); 이렇게 쓰면 된다. 이럴 경우 0~9까지 정의되며 1~10까지 원할 경우
int a = random.nextInt(10) + 1;을 해주면 된다.
package day003.class04;
import java.util.Random;
public class Test02 {
public static void main(String[] args) {
//랜덤
Random random = new Random();
//0부터 시작하면 random.nextInt();를 그대로 써도 됨
//1부터 시작하면 random.nextInt()+1; 을 하면 됨
//2부터면 +2, 3부터면 +3 등 다양함
/*랜덤 정수가 2개 있습니다.
* 작은수에서 큰수까지 출력하면서 홀수만 출력하세요.
* */
int a = random.nextInt(10) + 1; //a값은 1~10
int b = random.nextInt(10) + 1; //b값은 1~10
int start = Math.min(a, b); //start는 a,b 중에 더 작은 값
int end = Math.max(a, b); //end는 a,b 중에 더 큰 값
for(int i=start; i<=end; i++){ //start 값부터 end값까지 1만큼 상승
if(i%2==1){ //i를 2로 나누었을 때 나머지 값이 1인 경우
System.out.println(i); //i를 출력
}
}
System.out.println("시작값 : " + start);
System.out.println("끝값 : " + end);
}
}
3,6,9 게임을 random 객체를 통해 임의로 숫자를 정의하고 코드를 통해 박수를 쳐보자.
package day003.class04;
import java.util.Random;
/* 10~99 사이의 정수가 있습니다.
* 숫자에 3,6,9가 들어가면
* 박수를 쳐주세요
* 안들어가면 숫자를 출력해주세요
* ex) 33 39 96은 짝짝
* ex) 13 짝
* ex) 11은 그냥 11*/
public class Test03 {
public static void main(String[] args) {
Random random = new Random();
//십의 자리랑 일의 자리를 분리해서 3,6,9 맞춰야 할 것 같음
//맞출 때마다 카운트를 올려서 카운트 횟수에 맞게 박수 출력
for (int i = 0; i < 5; i++) {
// 10~99 사이의 랜덤 숫자 생성
int number = random.nextInt(90) + 10;
// 십의 자리와 일의 자리 분리하고 진행
int tens = number / 10; // 십의 자리
int ones = number % 10; // 일의 자리
// 박수 횟수 카운트
int cnt = 0;
if (tens == 3 || tens == 6 || tens == 9) { //십의 자리가 3,6,9일 때 카운트 +1
cnt += 1;
}
if (ones == 3 || ones == 6 || ones == 9) { //일의 자리가 3,6,9일 때 카운트 +1
cnt += 1;
}
if (cnt == 2) {
System.out.println(number + "는 짝짝");
} else if (cnt == 1) {
System.out.println(number + "는 짝");
} else {
System.out.println(number);
}
}
}
}
'Back-End' 카테고리의 다른 글
| [JAVA] 기초 공부 5(배열, 정렬) (0) | 2025.01.02 |
|---|---|
| [JAVA] 문제 풀기(기초) (0) | 2025.01.01 |
| [JAVA] 기초 공부 4(문제풀기) (1) | 2024.12.31 |
| [JAVA] 기초 공부 2(if,while,별찍기) (2) | 2024.12.27 |
| [JAVA] 기초 공부(연산자, if) (1) | 2024.12.26 |