ABCDE
FGHIJ
KLMNO
PQRST
UVWXY
Z
int count=0;
for (char ch='A'; ch<='Z'; ch++) {
count++;
System.out.print(ch);
// System.out.print(count + " ");
if(count%5==0) {
System.out.println();
}//if end
}//for end
System.out.println();
[해설]
for (char ch='A'; ch<='Z'; ch++)
- for문을 이용해서 대문자 A부터 Z까지 읽도록 한다.
count++; → int count=0;
- count 변수에 증감연산자로 넣어주면
- 5의 배수일 때 println(); 을 적용시켜주면 된다는 것을 확인할 수 있다.
if(count%5==0)
- count 정수형 변수에 나머지연산자 %로 5를 나누어 남은 값이 0과 같으면 (=5의 배수면)
System.out.println();
- 줄바꿔서 출력
[⚠️ 오답노트]
✔️ int count = 0; 변수를 따로 생성할 생각을 하지 못했다.
✔️ 숫자형 변수를 주고 if문에 (count%5==0) 를 주었으면 간단하게 풀었을 텐데.. 문자형에 연산자를 주려하니 얼마를 나눠야 하는지 생각하다가 시간을 많이 잡아 먹었다.
✏️ 문자형을 나열하고 줄바꾸기 할 때는 숫자형 변수를 하나 생성해서 풀어보자.
문자형에 나머지 연산자 사용하기 (아스키코드 적용)
for(char ch='A'; ch<='Z'; ch++) {
if(ch%5==4){
System.out.println(ch);
} else {
System.out.print(ch);
}
}//for end
System.out.println();
아스키 코드에서 E,J,O,T,Y는 5로 나누었을 때 나머지값이 4가 나온다.
for(char ch='A'; ch<='Z'; ch++)
- 반복문으로 대문자 A-Z 까지 읽도록 한다.
if(ch%5==4)
- 문자를 5로 나누었을 때 나머지값이 4로 나오면
System.out.println(ch); - true
- 줄을 띄어서 출력하고
else {System.out.print(ch);} - false
- 나머지값이 4로 나오지 않는다면 일렬로 출력한다.
####
###
##
#
for (int a=1; a<=4; a++) {
for (int b=1; b<=4; b++) {
if(a<=b) {
System.out.print("#");
}else {
System.out.print(" ");
}//if end
}//for end
System.out.println();
}//for end
System.out.println();
for (int a=1; a<=4; a++) {
for (int b=1; b<=4; b++) {
- a=1 일 때 b=1,2,3,4를 출력한다. 맨 윗줄은 1,2,3,4 모두 다 출력하려면 1과 같거나 큰 수가 와야한다. (a<=b) 1 <= 1,2,3,4
- a=2일 때 b=1,2,3,4 를 출력한다. 두번째 줄은 2,3,4만 출력하려면 2와 같거나 큰 수만 와야한다. (a<=b) 2<=2,3,4
- 나머지 a=3, a=4도 반복해서 출력한다.
System.out.print("#"); - true
- a보다 같거나 큰 수가 오면 # 출력
System.out.print(" "); - false
- else 아니라면 공백 출력
[⚠️ 오답노트]
for (int a=4; a>=1; a--) {
for (int b=1; b<=a; b++) {
System.out.print("#");
}//for end
System.out.println();
}//for end
이렇게 출력됨..
####
###
##
#
✔️ 4x4칸 모두 출력하고 공백을 줄 생각을 하지 못했음.
✏️ 모양을 보고 어떻게 출력할지 생각하지 말고, 저 형태를 숫자로 바꿔서 생각해보기
* 다음식의 결과값을 구하시오.
1 2 3 4 5 99
─ - ─ + ─ - ─ + ─ ... ── = ?
2 3 4 5 6 100
double hap=0.0;
boolean flag=false;
for(int a=1; a<=99; a++) {
if(flag) {
hap = hap - (a/(double)(a+1));
flag=false;
}else {
hap = hap + (a/(double)(a+1));
flag=true;
}//if end
}// for end
System.out.println(hap);
System.out.println();
💻 console
0.6881721793101957
double hap=0.0;
- 분수를 더하기 때문에 합을 넣을 수 있는 실수형 변수를 하나 생성한다.
boolean flag=false;
- true, false 값이 들어갈 수 있는 flag변수에 flase값을 넣어준다.
- 왜냐하면, - + 를 교차로 연산시켜줘야 하기 때문이다.
for(int a=1; a<=99; a++)
- 반복문으로 1-99까지 숫자가 나올 수 있도록 범위를 지정한다. (식을 보면 범위는 1-100까지 인데 왜 1-99까지만 합니까? 에 대한 답 클릭!)
if(flag) {
hap = hap - (a/(double)(a+1));
flag=false;
}
- if(flag)에서 flag는 boolean flag=false; 이므로 else문으로 간다.
else {
hap = hap + (a/(double)(a+1));
flag=true;
}//if end
- (a/(double)(a+1))를 연산한 값을 hap 변수에 넣어준다.
- (double) 은 a와 a+1이 정수형이기 때문에 강제 형변환을 시켜야 실수형으로 값을 도출할 수 있다.
- (a/(double)(a+1)) : 분수 숫자의 변형 패선을 보면 a/a+1 인 것을 알 수 있다.
- 그리고 flag=true; flag값을 true로 바꿔주어 boolean flag=true; 로 바뀝니다!
- 그럼 if문이 실행되어 빼기값이 들어가겠죠~
a a a a
⎯⎯ - ⎯⎯ + ⎯⎯ - ⎯⎯ . . .
a+1 a+1 a+1 a+1
여기서 a를 for문으로 i++증가시켜주면 a와 a+1도 1씩 100까지 증가할 것이다.
✅ 99까지 설정한 이유 찾아오셨죠? ㅎㅎ
↳ 분모엔 a+1이 되기 때문에 99까지만 해줘도 되는 것이었습니다!.. 대단하죠?
[⚠️ 오답노트]
✔️ 구글 검색해서 풀었다...
double hap1 = 0.0;
javaboolean flag1 = false;
for(int a=1; a<100; a++){
if(flag1){
hap1 = hap1 - (a/(double)(a+1));
flag1 =false;}
else {
hap1 = hap1 + (a/(double)(a+1));
flag1 =true;
}
}
System.out.println(hap1);
✔️ flag에 대한 정확한 개념을 알지못하고 긁었기 때문에 의미가 없음.. (그래도 한게 어디?..)
✔️ flag로 할 생각을 일단 못했고
✔️ (a/(double)(a+1))의 패턴을 찾지 못했음..
* flag변수 : 스위치 변수로 미리 true, false값 둘 중에 하나를 넣어놓고, 어떤 조건에 부합하면 flag의 기존 값을 반대로 바꿔준다. 그 값을 비교해서 true나 false에 따라서 처리가 달라지는 것
✏️ 먼저 주어진 값의 숫자의 범위를 확인하고, 그 값 안에서 어떻게 처리를 할지 잘 생각해보자.
✏️ - + 교차로 연산해야하니까 flag를 활용해야겠다는 생각!!
✏️ 반드시 변수와 연산자의 자료형이 일치하는지 체크할것!!
* 아래와 같이 계산해서 출력하시오
1+....+10=55
11+....+20=155
21+....+30=255
81+....+90=
91+....+100=955
int sum=0;
for(int a=10; a<=100; a+=10) {
// System.out.println(a);
for(int b=a-9; b<=a; b++) {
// System.out.println(b);
sum=sum+b;
}//for end
System.out.println((a-9) + "+...+" + a + "=" + sum);
sum=0;
}//for end
System.out.println();
💻 console
1+...+10=55
11+...+20=155
21+...+30=255
31+...+40=355
41+...+50=455
51+...+60=555
61+...+70=655
71+...+80=755
81+...+90=855
91+...+100=955
int sum=0;
- 누적합 구할 변수for(int a=10; a<=100; a+=10)
- 10부터 10씩 더해서 100이 되기 전까지 반복하는 반복문for(int b=a-9; b<=a; b++)
- 2중 for문, a가 100전까지 10씩 증가할때 b는 a-9부터 a전까지 증가시킨다.sum=sum+b;
- 이 조건을 만족하는 동안은 sum 변수에 누적해서 더한다.System.out.println((a-9) + "+...+" + a + "=" + sum);
- 두번째 for문이 종료되면 반복문을 빠져나와 괄호안에 있는 문장을 출력한다.sum=0;
- 누적의 합 초기화[⚠️ 오답노트]
✔️ -9 씩 차이가 반복된다는 점을 찾기는 커녕.. 1부터 100까지 반복문 돌림..
✔️ 이중for문.. a값을 넣어야 한다는 걸 생각 못함 ~~ 이야~!!
✔️ sum=0;..
✏️ 강사님께서는 식의 반복되는 패턴을 캐치하셔서 그걸 코드에 반영하시는 것 같다.
✏️ 합을 새로 구할 때 초기화식 sum=0; 꼭 떠올리기~!!
* 어느 달팽이는 낮에는 3cm올라가고, 밤에는 2.5cm 내려온다고 할때
달팽이가 13cm의 나무 꼭대기에 올라가려면 며칠이 걸리는지 구하시오
int day=0; //결과값
double snail=0.0; //달팽이
while(true) { //무한반복문
day++;
snail=snail+3.0;
if(snail>=13.0) {
break;
}else {
snail=snail-2.5;
}//if end
}//while
System.out.println(day + "일");
💻 console
21일
int day=0;
- 며칠 걸리는지? 변수 생성 (결과값)double snail=0.0;
- 달팽이 오르락 내리락하는 cm값 여기에 누적시키기 while(true)
- 무한 반복문으로 설정day++;
- +1일snail=snail+3.0;
- 낮에는 3cm 올라감 if(snail>=13.0) {
break;
}
- 달팽이가 13cm 의 나무 꼭대기에 올라가면 반복문 완전히 빠져나감. 종료else {
snail=snail-2.5;
}//if end
- 13cm 도달하지 못하면 밤에는 -2.5씩 내려옴[⚠️ 오답노트]
✔️ 결과값을 미리 보여주셨을 때랑은 다른 유형의.. 스토리텔링식 문제..
✔️ 도대체 어디서부터 설정해야하는지 감도 안왔음
✔️ 낮에는 +3, 밤에는 -2.5, 13일때 break를 줘야하는지까지 생각했지만 반복문, if문 변수 생성.. 하지 못했다. 시간도 부족해서 풀지 못했음..
✏️ 밤에는 2.5씩 내려오기 때문에 달팽이 변수 double로 줘야한다는 점 잊지말기!! (자료형 일치!!!)