[4-1] 다음의 문장들을 조건식으로 표현하라.
답:
1. 10<x && x<20
2. ch!=' ' && ch!='\t'
3. ch=='x' || ch=='X'
4. '0'<=ch && ch<='9'
5. ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
6. year%400==0 || year%4 && year%100!=0
7. powerOn==false
8. str.equals("yes")
[4-2] 1부터 20까지의 정수 중에서 2 또는 3의 배수가 아닌 수의 총합을 구하시오.
답:
public class Exercise4_2 {
public static void main(String[] args) {
int sum = 0;
for(int i=1;i<=20;i++){
if(i%2!=0 && i%3!=0) //i가 2또는 3의 배수가 아닐 때만 sum에 i를 더한다.
sum +=i;
}
System.out.println(sum);
}
}
[4-3] 1+(1+2)+(1+2+3)+(1+2+3+4)+...+(1+2+3+...+10)의 결과를 계산하시오.
답:
public class Exercise4_3 {
public static void main(String[] args) {
int sum = 0;
int tmpSum = 0;
// 누적합 문제
for(int i=1;i<=10;i++){
for(int j=1;j<=i;j++){
tmpSum += j;
System.out.println("[tmpSum]"+i+"번째: "+tmpSum);
}
sum += tmpSum;
System.out.println("[sum]"+i+"번째: "+sum);
System.out.println("------------");
}
System.out.println(sum);
System.out.println(tmpSum);
}
}
풀이:
[tmpSum]1번째: 1
[sum]1번째: 1
------------
[tmpSum]2번째: 2
[tmpSum]2번째: 4
[sum]2번째: 5
------------
[tmpSum]3번째: 5
[tmpSum]3번째: 7
[tmpSum]3번째: 10
[sum]3번째: 15
------------
[tmpSum]4번째: 11
[tmpSum]4번째: 13
[tmpSum]4번째: 16
[tmpSum]4번째: 20
[sum]4번째: 35
------------
[tmpSum]5번째: 21
[tmpSum]5번째: 23
[tmpSum]5번째: 26
[tmpSum]5번째: 30
[tmpSum]5번째: 35
[sum]5번째: 70
------------
[tmpSum]6번째: 36
[tmpSum]6번째: 38
[tmpSum]6번째: 41
[tmpSum]6번째: 45
[tmpSum]6번째: 50
[tmpSum]6번째: 56
[sum]6번째: 126
------------
[tmpSum]7번째: 57
[tmpSum]7번째: 59
[tmpSum]7번째: 62
[tmpSum]7번째: 66
[tmpSum]7번째: 71
[tmpSum]7번째: 77
[tmpSum]7번째: 84
[sum]7번째: 210
------------
[tmpSum]8번째: 85
[tmpSum]8번째: 87
[tmpSum]8번째: 90
[tmpSum]8번째: 94
[tmpSum]8번째: 99
[tmpSum]8번째: 105
[tmpSum]8번째: 112
[tmpSum]8번째: 120
[sum]8번째: 330
------------
[tmpSum]9번째: 121
[tmpSum]9번째: 123
[tmpSum]9번째: 126
[tmpSum]9번째: 130
[tmpSum]9번째: 135
[tmpSum]9번째: 141
[tmpSum]9번째: 148
[tmpSum]9번째: 156
[tmpSum]9번째: 165
[sum]9번째: 495
------------
[tmpSum]10번째: 166
[tmpSum]10번째: 168
[tmpSum]10번째: 171
[tmpSum]10번째: 175
[tmpSum]10번째: 180
[tmpSum]10번째: 186
[tmpSum]10번째: 193
[tmpSum]10번째: 201
[tmpSum]10번째: 210
[tmpSum]10번째: 220
[sum]10번째: 715
------------
sum은 715
tmpSum은 220
[4-4] 1+(-2)+3+(-4)+... 과 같은 식으로 계속 더해나갔을 때, 몇까지 더해야 총합이 100이상이 되는지 구하시오.
답:
public class Exercise4_4 {
public static void main(String[] args) {
int sum = 0;
// 음수, 양수 변환을 위한 1
int s = 1;
int num = 0;
// 1 증가할 때마다 부호 변환, 변수에 대한 조건을 두개 쓸 수 있다는걸 알게 됨
for(int i = 1; sum < 100; i++,s=-s) {
num = i*s;
sum += num;
}
System.out.println(num);
System.out.println(sum);
}
}
[4-5] 다음의 for문을 while문으로 변경하시오.
답:
public class Exercise4_5 {
public static void main(String[] args) {
for (int i = 0; i <= 10; i++) {
for (int j = 0; j <= i; j++)
System.out.print("*");
System.out.println();
}
}//endofmain
}//endofclass
// 이게 답
class Exercise4_5_2 {
public static void main(String[] args) {
int i=0;
while(i<=10){
for (int j = 0; j <= i; j++)
System.out.print("*");
System.out.println();
i++;
}
}//endofmain
}//endofclass
[4-6] 두 개의 주사위를 던졌을 때, 눈의 합이 6이 되는 모든 경우의 수를 출력하는 프로그램을 작성하시오.
답:
public class Exercise4_6 {
public static void main(String[] args) {
// 주사위는 1-6까지 있음
// 주사위1 + 주사위2 = 6이 되어야 함
/*
* 1+5
* 2+4
* 3+3
* 4+2
* 5+1
* */
for(int i=1;i<=6;i++){
for(int j=1;j<=6;j++){
if(i+j==6){
System.out.println("("+i+","+j+")");
}
}
}
}
}
[4-7] Math.random()을 이용해서 1부터 6사이의 임의의 정수를 변수 value에 저장하는
코드를 완성하라. (1)에 알맞은 코드를 넣으시오.
답:
public class Exercise4_7 {
public static void main(String[] args) {
int value =0;
for(int i=0;i<6;i++){
// Math.random()으로 0.0 이상 1.0 미만의 난수 발생
// 최대값 6을 곱해준다.
// 형 변환된 정수에 0이 포함되므로 +1 로 최솟값을 1로 맞춰준다.
value = (int) (Math.random()*6)+1;
}
System.out.println("value:"+value);
}
}
[4-8] 방정식 2x+4y=10의 모든 해를 구하시오. 단, x와 y는 정수이고 각각의 범위 는 0<=x<=10, 0<=y<=10 이다.
답:
public class Exercise4_8 {
public static void main(String[] args) {
/*
* x=1, y=2
* x=3, y=1
* x=5, y=0
* 2x+4y=10
* */
for(int x = 0; x <= 10; x++) {
for(int y = 0; y <= 10; y++) {
if((2*x+4*y)==10){
System.out.println("x="+x+",y="+y);
}
}
}
}
}
[4-9] 숫자로 이루어진 문자열 str이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라.
만일 문자열이 "12345"라면, ‘1+2+3+4+5’의 결과인 15를 출력이 출력되어야 한다.
(1)에 알맞은 코드를 넣으시오.
답:
// 풀이 1
public class Exercise4_9 {
public static void main(String[] args) {
String str = "12345";
int sum = 0;
for (int i = 0; i < str.length(); i++) {
sum += Integer.parseInt(String.valueOf(str.charAt(i)));
}
System.out.println("sum=" + sum);
}
}
// 풀이 2
class Exercise4_9_2 {
public static void main(String[] args) {
String str = "12345";
int sum = 0;
for (int i = 0; i < str.length(); i++) {
// '3'-'0' = 51-48 = 3
sum += str.charAt(i) -'0';
}
System.out.println("sum=" + sum);
}
}
15
참고 : 알파벳이나 숫자는 문자코드가 연속적으로 할당되어 있다는 특징을 이용.
뺄셈과 같은 이항연산자는 int 타입보다 작은 타입은 피연산자(byte, short, char)는 int로 변환한다.
문자
|
문자코드
|
...
|
...
|
'0'
|
48
|
'1'
|
49
|
'2'
|
50
|
'3'
|
51
|
...
|
...
|
[4-10] int타입의 변수 num 이 있을 때, 각 자리의 합을 더한 결과를 출력하는 코드를 완성하라.
만일 변수 num의 값이 12345라면, ‘1+2+3+4+5’의 결과인 15를 출력하라.
(1)에 알맞은 코드를 넣으시오.
[주의] 문자열로 변환하지 말고 숫자로만 처리해야 한다.
답:
public class Exercise4_10 {
public static void main(String[] args) {
int num = 12345;
int sum = 0;
int tenthousand = num / 10000;
int thousand = num / 1000 % 10;
int hundred = num / 100 % 10;
int ten = num / 10 % 10;
int one = num % 10;
sum = tenthousand+thousand+hundred+ten+one;
System.out.println("sum="+sum);
}
}
15
[4-11] 피보나치(Fibonnaci) 수열(數列)은 앞을 두 수를 더해서 다음 수를 만들어 나가는 수열이다.
예를 들어 앞의 두 수가 1과 1이라면 그 다음 수는 2가 되고
그 다음 수는 1과 2를 더해서 3이 되어서 1,1,2,3,5,8,13,21,34,55... 과 같은 식으로 진행된다.
1과 1부터 시작하는 피보나치수열의 10번째 수는 무엇인지 계산하는 프로그램을 완성하시오.
답:
public class Exercise4_11 {
public static void main(String[] args) {
// Fibonnaci 수열의 시작의 첫 두 숫자를 1, 1로 한다.
int num1 = 1; // default1
int num2 = 1; // default2
int num3 = 0; // 피보나치수열 계산할 변수
System.out.print(num1+","+num2);
// 1, 2는 더할 수 없어서 10-2 = 8까지만 반복, 인덱스가 0부터 시작이어서 8미만이어야 8이하
for (int i = 0 ; i < 8 ; i++ ) {
num3 = num1 + num2; // 세 번째 값은 첫 번째와 두 번째 값을 더해서 얻는다.
System.out.print(","+num3); // 세 번째 수열 출력
num1 = num2; // 두 번째 수열을 첫 번째 값으로 한다.
num2 = num3; // 세 번째 수열을 두 번째 값으로 한다.
}
}
}
[4-12] 구구단의 일부분을 다음과 같이 출력하시오.
답:
// 풀이 1 >>> 코드 웩
public class Exercise4_12 {
public static void main(String[] args) {
int tempIdx1 = 1;
String blank = " ";
// 3단씩만 출력
for (int i = 1; i <= 3; i++) {
if (tempIdx1 != i) {
System.out.println();
}
// 2단부터 4단
for (int j = 2; j <= 4; j++) {
if (i * j < 10) {
blank += blank;
}
System.out.print(j + "x" + i + "=" + (i * j) + blank);
tempIdx1++;
blank = " ";
}
}
System.out.println();
// 3단씩만 출력
for (int i = 1; i <= 3; i++) {
if (tempIdx1 != i) {
System.out.println();
}
// 2단부터 4단
for (int j = 5; j <= 7; j++) {
if (i * j < 10) {
blank += blank;
}
System.out.print(j + "x" + i + "=" + (i * j) + blank);
tempIdx1++;
blank = " ";
}
}
System.out.println();
// 3단씩만 출력
for (int i = 1; i <= 3; i++) {
if (tempIdx1 != i) {
System.out.println();
}
// 2단부터 4단
for (int j = 8; j <= 9; j++) {
if (i * j < 10) {
blank += blank;
}
System.out.print(j + "x" + i + "=" + (i * j) + blank);
tempIdx1++;
blank = " ";
}
}
}
}
// 풀이 2
class Exercise4_12_2 {
public static void main(String[] args) {
for (int i = 1 ; i <= 9 ; i++) {
for (int j = 1; j <= 3; j++) {
int x = j+1+(i-1)/3*3;
int y = i%3==0? 3 : i%3 ;
if(x > 9) // 9단까지만 출력한다. 이 코드가 없으면 10단까지 출력된다.
break;
System.out.print(x+"*"+y+"="+x*y+"\t"); //println이 아님에 주의
}
System.out.println();
if(i%3==0) System.out.println(); //
}
} // end of main
} // end of class
(1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.
답:
//풀이 1
public class Exercise4_13 {
public static void main(String[] args) {
String value = "12o34";
char ch = ' ';
boolean isNumber = true;
// 반복문과 charAt(int i)를 이용해서 문자열의 문자를 하나씩 읽어서 검사한다.
for(int i=0; i < value.length() ;i++) {
ch = value.charAt(i);
if (ch-'0' < 0 || ch-'0' > 9) {
isNumber = false;
break;
}
}
if (isNumber) {
System.out.println(value+"는 숫자입니다.");
} else {
System.out.println(value+"는 숫자가 아닙니다."); // 결과 : 12o34는 숫자가 아닙니다.
}
}
}
// 풀이2
class Exercise4_13_2 {
public static void main(String[] args) {
String value = "12o34";
char ch = ' ';
boolean isNumber = true;
// 반복문과 charAt(int i)를 이용해서 문자열의 문자를 하나씩 읽어서 검사한다.
for(int i=0; i < value.length() ;i++) {
ch = value.charAt(i);
if(!('0'<=ch && ch<='9')) {
isNumber = false;
break;
}
}
if (isNumber) {
System.out.println(value+"는 숫자입니다.");
} else {
System.out.println(value+"는 숫자가 아닙니다."); // 결과 : 12o34는 숫자가 아닙니다.
}
}
}
[4-14] 다음은 숫자맞추기 게임을 작성한 것이다.
1과 100사이의 값을 반복적으로 입력해서 컴퓨터가 생각한 값을 맞추면 게임이 끝난다.
사용자가 값을 입력하면, 컴퓨터는 자신이 생각한 값과 비교해서 결과를 알려준다.
사용자가 컴퓨터가 생각한 숫자를 맞추면 게임이 끝나고 몇 번 만에 숫자를 맞췄는지 알려준다.
(1)~(2)에 알맞은 코드를 넣어 프로그램을 완성하시오.
답:
public class Exercise4_14 {
public static void main(String[] args) {
// 1~100사이의 임의의 값을 얻어서 answer에 저장한다.
int answer = (int) (Math.random()*100) + 1;
// System.out.println("answer:"+answer);
int input = 0; // 사용자입력을 저장할 공간
int count = 0; // 시도횟수를 세기위한 변수
// 화면으로 부터 사용자입력을 받기 위해서 Scanner클래스 사용
java.util.Scanner s = new java.util.Scanner(System.in);
do {
count++;
System.out.print("1과 100사이의 값을 입력하세요 :");
input = s.nextInt(); // 입력받은 값을 변수 input에 저장한다.
if (input == answer) {
System.out.println(count);
break;
}
} while (true); // 무한반복문
}
}
[4-15] 다음은 회문수를 구하는 프로그램이다.
회문수(palindrome)란, 숫자를 거꾸로 읽어도 앞으로 읽는 것과 같은 수를 말한다.
예를 들면 ‘12321’이나 ‘13531’같은 수를 말한다.
(1)에 알맞은 코드를 넣어서 프로그램을 완성하시오.
[Hint] 나머지 연산자를 이용하시오.
답:
// 풀이 1
public class Exercise4_15 {
public static void main(String[] args) {
int number = 12321;
int tmp = number;
int result = 0; // 변수 number를 거꾸로 변환해서 담을 변수
while (tmp != 0) {
if (tmp % 10 == number / 10000) { // tmp의 5째자리 == number의 1째자리
if (tmp / 10 % 10 == number / 1000 % 10) { // tmp의 4째자리 == number의 2째자리
if (tmp / 100 % 10 == number / 100 % 10) { // tmp의 3째자리 == number의 3째자리
if (tmp / 1000 % 10 == number / 10 % 10) { // tmp의 2째자리 == number의 4째자리
if (tmp / 10000 == number % 10) { // tmp의 2째자리 == number의 4째자리
result = number;
break;
}
}
}
}
}
}
if (number == result)
System.out.println(number + "는 회문수 입니다."); // 결과 : 12321는 회문수 입니다.
else
System.out.println(number + "는 회문수가 아닙니다.");
}
}
// 풀이 2
class Exercise4_15_2 {
public static void main(String[] args) {
int number = 12321;
int tmp = number;
int result = 0; // 변수 number를 거꾸로 변환해서 담을 변수
while (tmp != 0) {
result = result * 10 + tmp % 10;
tmp /= 10;
}
if (number == result)
System.out.println(number + "는 회문수 입니다."); // 결과 : 12321는 회문수 입니다.
else
System.out.println(number + "는 회문수가 아닙니다.");
}
}
풀이
'개념' 카테고리의 다른 글
[JAVA의 정석] Chapter06_연습문제 (1) | 2024.12.10 |
---|---|
[JAVA의 정석] Chapter05_연습문제 (0) | 2024.12.08 |
[JAVA의 정석] Chapter03_연습문제 (0) | 2024.09.19 |
[JAVA의 정석] Chapter02_연습문제 (0) | 2024.09.19 |
[JAVA의 정석] Chapter16 (4) | 2024.09.08 |