1. 두개의 수와 배수 n을 입력받아 두 수 사이의 n 배수의 합을 구하는 프로그램을 작성해보자.
오랜만에 수학적인 문제를 생각하려니, 머리가 회전되지 않는게 가장 큰 문제였으나, 가장 무식하게, 연습장에다가 써보면서 문제를 차근차근 풀어가기로 마음먹었다.
예를 들어, 10부터 20까지의 수중, 4의 배수를 구하는 문제를 대입해 보았다.
4의 배수를 처음부터, second 에 입력될 20까지 차례 대로 나열하면 다음과 같다.
이제 문제는 여기서, 어떻게 하면, 범위내의 배수를 빼내느냐, 즉, 10부터 20이라는 숫자 사이의 있는 4의 배수를 어떻게 빼내오느냐의 문제가 발생한다.
그때 생각난 것이 continue 예약어였다. 만약 4의 배수가 10보다 작으면, 아무 수행도 하지 않고, 다음 반복할 작업으로 바로 넘어가도록 만드는 것인데, 거기에 continue 가 가장 제격이었다.
그렇게, 하고, 마지막에는, 배수들의 합을 sum 에 저장하는 것으로 마무리 했다.
이렇게 다 풀고 나서, 풀이를 보니....
이...이렇게 간단하게 풀줄이야..... -0- 여전히... 돌머리임에는.. 틀림없다....
2. 문자 하나를 입력받아 대문자인지 소문자인지 구별하는 프로그램을 작성.
3. 연도를 입력받아 윤년인지 아닌지를 구별하는 프로그램.(윤년은 일반적으로 4년에 한번씩 돌아오는데, 그중 100으로 나누어 떨어지는 해는 윤년이 아니다. 그러나 100으로 나누어 떨어지는 해 중에서도 400으로 나누어 떨어지는 해는 윤년이다.)
총 3단계의 검색을 거친다고 볼수가 있는데, 처음, 입력한 년도가 4로 나누어지는지를 검사한다. 만약, 나누어 지지 않는다면, 19번째 라인이 실행되어, 윤년이 아니라는 메세지가 출력된다.
4로 나누어지는 지를 통과하면, 100으로 나누어지는 지를 확인한다. 만약, 나누어지지 않는다면, 16번째 라인이 실행, 윤년이라는 메시지가 출력된다.
100으로 나누어지면, 400으로 나누어지는 지를 마지막으로 검사한다. 만약, 400으로 나누어지면 윤년이라는 메시지를, 아니라면 윤년이 아니라는 메시지를 출력하게 되어있다.
문제는 예상외로 쉬우나, 나같이 돌머리를 소유한 자라면, 예상외로 힘들게 풀지도... 아무튼, if ~ else 문에 대해서 착각하지 않는다면, 쉽게 풀릴 문제.
4. 주민등록번호 8번째 자리를 입력받아 출생지를 알아보는 프로그램을 작성.(인터넷 검색을 이용하여 각 숫자가 나타내는 지역을 알아보자. 예를 들면 123456-7891234에서 8이라는 숫자가 적혀있는 자리는 출생지를 나타낸다. 그 숫자가 0이면 '서울' 이런 식인데 인터넷에서 검색하여 알아보자.)
5. 구구단을 출력하는 프로그램을 작성해 보자.
6. 앞서 배운 계산기 프로그램을 만들어서 한번 계산을 한 후 다시 게산을 할 것인지 물어 보고 수행을 계속할 것인지를 결정하는 프로그램을 만들어 보자.
7. 연도와 월을 입력받아 달력을 출력하는 프로그램을 작성(윤년도 확인해야 하고 요일도 나타나야 한다.) 참고 : 배열 없이 프로그램 작성
그래서 이해가 안가는 부분이 몇가지가 있었는데, total 이라는 변수와, 달력을 출력시 틀에 맞춰 출력시키기 위한 코딩부분에서 이해가 안가는 부분이 몇가지 있었다.
특히 위의 yr-1 부분은 여전히 이해가 안가는 부분이다.
이 문제는 일단, 여기서 종료.
1// import java.io.*;첫 번째로 할일은 규칙을 찾는 일일 것이다. 얼마전 해봤던 두수의 크기 비교를 약간 응용한 문제였기 때문에, 그 부분까지는 문제가 되지 않았으나(16번째 라인까지), 문제는, 어떻게 하면 입력받은 두수안에서, 입력한 배수를 구하고, 그것의 합을 구하느냐였다.
2// public class SumTwoMulti {
3// public static void main(String[] args) throws IOException {
4// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
5// int first = 0, second = 0, mul = 0, sum = 0, temp = 0;
6// System.out.print("Input the Frist Number : ");
7// first = Integer.parseInt(in.readLine());
8// Ststem.out.print("Input the Second Number : ");
9// second = Integer.parseInt(in.readLine());
10// System.out.print("Input the Multiple : ");
11// mul = Integer.parseInt(in.readLIne());
12// if(first >= second) {
13// temp = second;
14// second = first;
15// first = temp;
16// }
17// for(int i = 1; mul * i <= second; ++i) {
18// if(mul * i < first) continue;
19// sum += mul * i;
20// }
21// // for(int i = first; i <= second; ++i) {
22// // if(i % mul == 0) {
23// // sum += i;
24// // }
25// // }
26// System.out.println();
27// System.out.println("The Sum of Multiple from " + first + " to " + second + " is " + sum);
28// }
29// }
오랜만에 수학적인 문제를 생각하려니, 머리가 회전되지 않는게 가장 큰 문제였으나, 가장 무식하게, 연습장에다가 써보면서 문제를 차근차근 풀어가기로 마음먹었다.
예를 들어, 10부터 20까지의 수중, 4의 배수를 구하는 문제를 대입해 보았다.
4의 배수를 처음부터, second 에 입력될 20까지 차례 대로 나열하면 다음과 같다.
4 * 1 = 4이에 관한 for 문이 바로 17번째 라인에 있는 for문이다.
4 * 2 = 8
4 * 3 = 12
4 * 4 = 16
4 * 5 = 20
4 * 6 = 24
이제 문제는 여기서, 어떻게 하면, 범위내의 배수를 빼내느냐, 즉, 10부터 20이라는 숫자 사이의 있는 4의 배수를 어떻게 빼내오느냐의 문제가 발생한다.
4 * 1 = 4 (X)20 이후의 문제는, 17번째 라인의 for 문에서 20이 될때까지 반복 실행하라고 하였으니, 20 이후의 문제는 없지만, 10 이전의 문제는, 어떻게 하면 풀수 있을까?
4 * 2 = 8 (X)
4 * 3 = 12 (O)
4 * 4 = 16 (O)
4 * 5 = 20 (O)
4 * 6 = 24 (X)
그때 생각난 것이 continue 예약어였다. 만약 4의 배수가 10보다 작으면, 아무 수행도 하지 않고, 다음 반복할 작업으로 바로 넘어가도록 만드는 것인데, 거기에 continue 가 가장 제격이었다.
그렇게, 하고, 마지막에는, 배수들의 합을 sum 에 저장하는 것으로 마무리 했다.
이렇게 다 풀고 나서, 풀이를 보니....
이...이렇게 간단하게 풀줄이야..... -0- 여전히... 돌머리임에는.. 틀림없다....
2. 문자 하나를 입력받아 대문자인지 소문자인지 구별하는 프로그램을 작성.
import java.io.*;이 문제는 굳이 설명할 필요가 있을까... 그래서 패스..
public class Capital {
public static void main(String[] args) throws IOException {
char ch;
System.out.print("Input the One Character : ");
ch = (char)System.in.read();
if(ch >= 'a' && ch <= 'z') {
System.out.println(ch + " is a small letter.");
} else if(ch >= 'A' && ch <= 'Z') {
System.out.println(ch + " is a capital letter.");
} else
System.out.println(ch + " is not the Alphabet.");
}
}
3. 연도를 입력받아 윤년인지 아닌지를 구별하는 프로그램.(윤년은 일반적으로 4년에 한번씩 돌아오는데, 그중 100으로 나누어 떨어지는 해는 윤년이 아니다. 그러나 100으로 나누어 떨어지는 해 중에서도 400으로 나누어 떨어지는 해는 윤년이다.)
1// import java.io.*;if ~ else 문이라는 구문에 대해서 약간 헷걸렸던 문제다. 가끔가다, 수박을 보고, 수박이라는 단어가 문득 생소하다는 것을 느끼듯, 이 문제도 if ~ else 문에서, 잠시 사용법에서 약간의 혼돈이 와서.... 역시, 프로그래밍은 자주 사용해야 한다니까.... -0-
2// public class LeapYear {
3// public static void main(String[] args) throws IOException {
4// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
5// int ly = 0;
6// System.out.print("Input the year : ");
7// ly = Integer.parseInt(in.readLine());
8// if(ly % 4 == 0) {
9// if(ly % 100 == 0) {
10// if(ly % 400 == 0) {
11// System.out.println(ly + " is a leap year.");
12// } else {
13// System.out.println(ly + " is not a leap year.");
14// }
15// } else {
16// System.out.println(ly + " is a leap year.");
17// }
18// } else {
19// System.out.println(ly + " is not a leap year.");
20// }
21// }
22// }
총 3단계의 검색을 거친다고 볼수가 있는데, 처음, 입력한 년도가 4로 나누어지는지를 검사한다. 만약, 나누어 지지 않는다면, 19번째 라인이 실행되어, 윤년이 아니라는 메세지가 출력된다.
4로 나누어지는 지를 통과하면, 100으로 나누어지는 지를 확인한다. 만약, 나누어지지 않는다면, 16번째 라인이 실행, 윤년이라는 메시지가 출력된다.
100으로 나누어지면, 400으로 나누어지는 지를 마지막으로 검사한다. 만약, 400으로 나누어지면 윤년이라는 메시지를, 아니라면 윤년이 아니라는 메시지를 출력하게 되어있다.
문제는 예상외로 쉬우나, 나같이 돌머리를 소유한 자라면, 예상외로 힘들게 풀지도... 아무튼, if ~ else 문에 대해서 착각하지 않는다면, 쉽게 풀릴 문제.
4. 주민등록번호 8번째 자리를 입력받아 출생지를 알아보는 프로그램을 작성.(인터넷 검색을 이용하여 각 숫자가 나타내는 지역을 알아보자. 예를 들면 123456-7891234에서 8이라는 숫자가 적혀있는 자리는 출생지를 나타낸다. 그 숫자가 0이면 '서울' 이런 식인데 인터넷에서 검색하여 알아보자.)
import java.io.*;설명...필요한가????
public class ID8 {
public static void main(String[] args) {
int id8 = 0;
System.out.print("Input the 8th number of your ID : ");
id8 = System.in.read() - 48;
switch(id8) {
case 0 : System.out.println("You were born in Seoul."); break;
case 1 : System.out.println("You were born in Kyoung Gi, In Cheon."); break;
case 2 : System.out.println("You were born in Kang Won."); break;
case 3 : System.out.println("You were born in Chung Book."); break;
case 4 : System.out.println("You were born in Cung Nam, Dae Jeon."); break;
case 5 : System.out.println("You were born in Jeon Book."); break;
case 6 : System.out.println("You were born in Jeon Nam, Gwang Ju."); break;
case 7 : System.out.println("You were born in Kyoung Book, Dae Gu."); break;
case 8 : System.out.println("You were born in Kyoung Nam, Pusan."); break;
case 9 : System.out.println("You were born in Jeju."); break;
default : System.out.println("Who are you...???");
}
}
}
5. 구구단을 출력하는 프로그램을 작성해 보자.
import java.io.*;이것역시..설명이 필요한가???
public class Gugu {
public static void main(String[] args) throws IOException {
int gugu = 0;
System.out.print("Input the Multiplication number : ");
gugu = System.in.read() - 48;
System.out.println();
System.out.println("========= " + gugu + " =========");
for(int i = 1; i <= 9; ++i) {
System.out.println(gugu + " * " + i + " = " + (gugu * i);
}
}
}
6. 앞서 배운 계산기 프로그램을 만들어서 한번 계산을 한 후 다시 게산을 할 것인지 물어 보고 수행을 계속할 것인지를 결정하는 프로그램을 만들어 보자.
import java.io.*;설명은 주석문으로 대체.
public class Calc {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferdReader(new InputStreamReader(System.in));
int x = 0, y = 0;
char op = 0, yn = 0;
while(true) {
// 첫번째 숫자를 입력 받아서 변수 x에 저장
System.out.print("Input the First Number : ");
x = Integer.parseInt(in.readLIne());
// 연산자를 입력하는 부분. 출력된 +, -, *, /, % 외에 문자를 입력하면, 다시 입력할수 있도록
// 반복실행 시켜준다.
do{
System.out.print("Pick the Operators(+, -, *, /, %) : ");
op = (char)System.in.read();
System.in.read();
System.in.read();
} while(op != '+' && op != '-' && op != '*' && op != '/' && op != '%');
// 두번째 숫자를 입력받아 변수 y에 저장
System.out.print("Input the Second Number : ");
y = Integer.parseInt(in.readLine());
// 입력받은 연산자에 따라, 해당 위치로, 이동, 출력.
switch(op) {
case '+' : System.out.println(x + " " + op + " " + y + " = " + (x+y)); break;
case '-' : System.out.println(x + " " + op + " " + y + " = " + (x-y)); break;
case '*' : System.out.println(x + " " + op + " " + y + " = " + (x*y)); break;
case '/' : System.out.println(x + " " + op + " " + y + " = " + (x/y)); break;
case '%' : System.out.println(x + " " + op + " " + y + " = " + (x%y)); break;
}
// 다시 한번 계산을 할것인지를 물음.
System.out.print("One more? ");
yn = (char)System.in.read();
System.in.read();
System.in.read();
// 위의 질문에서 n이나 N 을 입력시 while 문을 탈출.
if(yn == 'N' || yn == 'n') break;
}
}
}
7. 연도와 월을 입력받아 달력을 출력하는 프로그램을 작성(윤년도 확인해야 하고 요일도 나타나야 한다.) 참고 : 배열 없이 프로그램 작성
import java.io.*;솔직히 풀다가 막힌 부분이 생겨, 다른 소스를 보고 약간의 편집을 통해 완성시킨 소스.
class Cal {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// yr : 입력 받을 년도를 저장, mth = 입력 받을 월을 저장,
// mth_day = 입력 받은 월에 해당하는 일수를 저장, day : 출력하게 될 날짜들을 저장,
// date : 입력받은 월의 전월까지의 총 일수를 저장
// ch_mon : 입력 받은 월에 해당되는 영어를 저장,
// blank : 달력 출력시, 시작되는 날짜와 요일에 따른 선행 빈 공간 출력
int yr = 0, mth = 0, mth_day = 0, day = 0, date = 0;
String ch_mon = "";
String blank1 = "", blank2 = "\t", blank3 = "\t\t", blank4 = "\t\t\t", blank5 = "\t\t\t\t", blank6 = "\t\t\t\t\t", blank7 = "\t\t\t\t\t\t";
// 년도 입력, 저장
System.out.print("Input the year by 4 units(EX : 2004) => ");
yr = Integer.parseInt(in.readLine());
// 월을 입력, 저장
// 입력받은 월에 해당되는 영어를 변수에 저장하며,
// 입력받은 월에 해당되는 일수를 저장한다.
// 또한 전월까지의 총 일수를 저장하며,
// 이 모든 과정을 평년과 윤년에 따라 수행되도록 한다.
do
{
System.out.print("Input the month(EX : 6) =? ");
mth = Integer.parseInt(in.readLine());
switch(mth) {
case 1 : ch_mon = "January"; mth_day = 31; break;
case 2 : ch_mon = "February";
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
mth_day = 29; // 윤년
} else {
mth_day = 28; // 평년
}
date = 31; break;
// 전월까지의 일수를 합해서 저장. 1월까지의 일수를 저장
case 3 : ch_mon = "March"; mth_day = 31;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29; break;
// 윤년시, 전월까지의 일수를 합해서 저장, 1월과 2월까지의 일수를 합산, 저장.
} else {
date = 31 + 28; break;
// 평년시, 전월까지의 일수를 합해서 저장, 1월과 2월까지의 일수를 합산, 저장.
}
case 4 : ch_mon = "April"; mth_day = 30;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31; break;
} else {
date = 31 + 28 + 31; break;
}
case 5 : ch_mon = "May"; mth_day = 31;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30; break;
} else {
date = 31 + 28 + 31 + 30; break;
}
case 6 : ch_mon = "June"; mth_day = 30;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31; break;
} else {
date = 31 + 28 + 31 + 30 + 31; break;
}
case 7 : ch_mon = "July"; mth_day = 31;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31 + 30; break;
} else {
date = 31 + 28 + 31 + 30 + 31 + 30; break;
}
case 8 : ch_mon = "August"; mth_day = 31;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31 + 30 + 31; break;
} else {
date = 31 + 28 + 31 + 30 + 31 + 30 + 31; break;
}
case 9 : ch_mon = "September"; mth_day = 30;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31; break;
} else {
date = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31; break;
}
case 10 : ch_mon = "October"; mth_day = 31;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30; break;
} else {
date = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30; break;
}
case 11 : ch_mon = "November"; mth_day = 30;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; break;
} else {
date = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31; break;
}
case 12 : ch_mon = "December"; mth_day = 31;
if(yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) {
date = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; break;
} else {
date = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30; break;
}
default : System.out.println("Please Input Again.");
}
}while (mth != 1 && mth != 2 && mth != 3 && mth != 4 && mth != 5 && mth != 6 && mth != 7 && mth != 8 && mth != 9 && mth != 10 && mth != 11 && mth != 12);
System.out.println(" ============== " + "<< " + yr + ", " + ch_mon + " >>" + " ============== ");
System.out.println();
System.out.println(" Sun\tMon\tTue\tWed\tThu\tFri\tSat ");
// 출력시, 시작일수와 요일에 따른 빈 공간을 출력하기 위한 부분, 하지만 이해안되는 식
// yr-1은 무얼까??
int extra = ((yr-1) + (yr-1)/4 - (yr-1)/100 + (yr-1)/400 + date + 1 ) % 7;
switch(extra) {
case 0 : System.out.print(blank1); break;
case 1 : System.out.print(blank2); break;
case 2 : System.out.print(blank3); break;
case 3 : System.out.print(blank4); break;
case 4 : System.out.print(blank5); break;
case 5 : System.out.print(blank6); break;
case 6 : System.out.print(blank7); break;
}
for(int i = 1; i <= mth_day; i++) {
day = i;
// 이해안되는 식
// (yr-1)/4 - (yr-1)/100 + (yr-1)/400 : 윤년횟수
// date : 전월까지의 일수를 총 합산한 일수
// day : 해당 날짜, 1일, 2일, 3일, ....
// yr-1 은 무얼까... -0-
int total = ((yr-1) + (yr-1)/4 - (yr-1)/100 + (yr-1)/400 + date + day ) % 7;
// 6보다 작으면 그대로 출력, 그렇지 않으면, 한줄 내려 출력
if(total % 7 < 6) {
// 10보다 작으면, 한자릿수라는 이야기 이므로, 한자릿수 앞에 0을 붙여 출력, 그렇지 않으면,
// 두자릿수라는 이야기로 0을 제외한 채 출력
if(day < 10) {
System.out.print(" 0" + day + "\t");
} else {
System.out.print(" " + day + "\t");
}
} else {
if(day < 10) {
System.out.println(" 0" + day + "\t");
} else {
System.out.println(" " + day + "\t");
}
}
}
}
}
그래서 이해가 안가는 부분이 몇가지가 있었는데, total 이라는 변수와, 달력을 출력시 틀에 맞춰 출력시키기 위한 코딩부분에서 이해가 안가는 부분이 몇가지 있었다.
특히 위의 yr-1 부분은 여전히 이해가 안가는 부분이다.
이 문제는 일단, 여기서 종료.