본문 바로가기

JAVA/명품 자바 프로그래밍

[명품 자바 프로그래밍] 3장 실습 문제

728x90

1.

 (1) 0-99까지 2씩 증가하며 더하는 코드. 

 (2) while

public class WhileTesst {
	public static void main(String[] args) {
		int sum=0, i=0;
		while(i<100) {
			sum=sum+i;
			i+=2;
		}
		System.out.println(sum);
	}
}

 whiletest로 써야되는데 잘못 썻네

 

 (3) for

public class ForTest {
	public static void main(String[] args) {
		int sum=0;
		for(int i=0; i<100; i+=2)
			sum+=i;
		
		System.out.println(sum);
	}
}

 

 (4) do-while

public class DoWhileTest {
	public static void main(String[] args) {
		int sum=0, i=0;
		
		do {
			sum+=i;
			i+=2;
		}while(i<100);

		System.out.println(sum);
	}
}

 

 


 

 

2. 비정방형 배열 출력

public class ex2 {
	public static void main(String[] args) {
		//비정방형 배열 생성 및 초기화
		int n[][]= {{1}, {1,2,3},{1},{1,2,3,4},{1,2}};
		
		//배열 출력
		//첫 번째 for문에서는 행의 길이 만큼, 두 번째 열의 길이만큼 반복
		for(int i=0; i<n.length; i++) {
			for(int j=0; j<n[i].length; j++)
				System.out.print(n[i][j]);
			System.out.println();
		}
	}
}

 

cf. 자바에서 1차원 배열 선언

int array[] = new int[5];

 왼쪽은 배열에 대한 레퍼런스(배열의 주소) 변수 선언이고, 오른쪽은 메모리에 배열의 저장 공간을 할당한 것이다. 

 

cf. 다차원 배열 선언(정방형)

int array[][] = new int[2][5];

 2행 5열의 2차원 배열이 선언 되었다. 이 상태에서 array.length를 하면 행의 길이인 2가 나오고, 현재 정방향 배열(행에 따른 열의 개수가 동일)한 상태이므로 array[i].length를 하면 열의 길이인 5가 나온다. 

 

cf. 다차원 배열(비정방형)

int array[][]=new int[4];
array[0]=new int[1];
array[1]=new int[2];
array[2]=new int[3];
array[3]=new int[4];

 본 코드와 같이 중괄호를 통해 원큐에 생성&초기화하는 방법도 있지만, 이렇게 선언만 해두는 방식도 있다. 위 코드를 실행하면 계단식 2차원 배열이 생성된다. 

 

 

 


 

 

 

3. 별  출력

import java.util.Scanner;
public class ex3 {
	public static void main(String[] args) {
		Scanner s =new Scanner(System.in);
		int n;
		
		//사용자로부터 정수를 입력받음
		System.out.print("정수를 입력하세요 : ");
		n=s.nextInt();
		
		//사용자가 입력한 숫자만큼의 별을 출력하되, 그 숫자를 하나씩 줄임
		while(n!=0) {
			for(int j=0; j<n; j++)
				System.out.print("*");
			System.out.println();
			n--;	
		}
		
		s.close();
	}
}

 처음에 이중 포문으로 할려고 했는데, 자바에서는 step자리에 --연산자가 안 되는건지 안 돌아가서 결국 while문으로 함. 아래가 바로 그 코드. 

for(i=n; i<0;i--) {
	for(int j=0; j<=i; j++)
		System.out.print("*");
	System.out.println();
}

 

<다시 푼 코드>

package lecture3;
import java.util.Scanner;
public class exe3 {
	public static void main(String[] args) {
		Scanner s= new Scanner(System.in);
		System.out.println("정수를 입력하시오>>");
		int num=s.nextInt();
		
		for(int i=num; i>0; i--) {
			for(int j=0; j<i; j++)
				System.out.print("*");
			System.out.println();
		}
		
		s.close();
	}
}

 


 

 

4. 알파벳 출력

import java.util.Scanner;
public class ex4 {
	public static void main(String[] args) {
		 Scanner s = new Scanner(System.in);
		      
		 //자바에서는 문자만 받는 것이 불가능. 문자열을 입력받고 charAt(0)을 통해서 첫번째 글자만 추출
		 System.out.print("소문자 알파벳 하나를 입력하시오>>");
		 char alpha = s.next().charAt(0);
		 
		 for(int i=0; i<(int)alpha-96; i++) {  //아스키 코드 소문자 97-122
			 for(char j='a'; j<=alpha-i; j++)  //알파벳 출력
				 System.out.print(j);	 
			 System.out.println();
		 }
		      s.close();
	}
}

 이거 꽤 애먹었다. 결국 연구실 친구가 알려줬는데, 그거 살짝 변형한 코드다. 과제라서 똑같이 낼 수가 없다.

 

 일단 자바에서는 한 글자만 받는 게 안 돼서, charAt(0)을 사용해서 첫번째 문자열만 따온다. (python으로 치면 alpha[0]이런 느낌인듯.) 진짜 안 되나 싶어서 charAt(0)을 지우고 해봤더니 typemismatch string을 char로 바꿀 수 없다고 뜬다. 그럼 왜 char형을 만들었나 생각하다 '한 글자를 저장하는 것'과 '한 글자를 입력 받는 건' 다르다는 걸 뒤늦게 떠올렸다.

 

 첫 번째 for문은 char형 alpha 변수를 int형으로 캐스팅(형변환)해서 96을 빼준다. 왜냐면 'a'가 아스키 코드로 97이라서. 만약 alpha에 'a'가 저장되어 있고, (int)alpha를 출력하면 97이 출력될 거다. 즉, 몇 번을 반복할 것인지 정하기 위한 거다. (저 코드에는 alpha='e'이고, 'e'는 아스키 코드로 101번. 101-96을 하면 5이므로 저 for문은 총 5번 반복한다.)

 

 두 번째 for문은 알파벳 출력을 위한 거다. 현재 alpha는 'e'로 아스키 코드로 101번. 손으로 다 써보면 쉽게 이해가 될 거다. 첫번째 반복에서 i=0, j<=alpha-1을 하면 j<=alpha까지다. 그러니까 'a'부터 'e'까지 모두 출력하는 것. 

 좀 놀란 건 반복문 항목에 char 형이 들어가고 char형 alpha에 int형 i를 뺄 수 있다는 거. 자동 타입 변환이 되는 걸까?

 

 

 


 

 

5. 정수 10개를 입력 받고 그 중 3의 배수만 출력하는 프로그램

import java.util.Scanner;
public class ex5 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n[]=new int[10];
		
		//배열에 10개의 정수 삽입
		System.out.print("양의 정수 10개를 입력하세요 : ");
		for(int i=0; i<10; i++) 
			n[i]=s.nextInt();
		
		//3의 배수만 출력
		for(int i=0; i<10; i++) {
			if(n[i]%3==0)
				System.out.print(n[i]+ " ");
		}
		
		s.close();
	}
}

 

 


 

 

6. 거스름돈 출력

import java.util.Scanner;
public class ex6 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int m=0;
		
		System.out.println("금액을 입력하세요 : ");
		int money=s.nextInt();
		
		//환산할 돈의 종류
		int unit[]= {50000,10000,1000,500,100,50,10,1};
		
		for(int i=0; i<unit.length; i++) {
			m=(int)money/unit[i]; 
			money%=unit[i];
			System.out.println(unit[i]+"원 짜리 : "+m+"개");
		}
		
		s.close();
	}
	
}

 

 m은 각 단위의 돈이 몇 개 나오는 지 계산한 값을 저장하는 변수다. 입력한 값이 65123인데 이를 배열의 첫번째 요소인 50000으로 나누면 몫으로 1이 나온다. 그런데 이렇게 계산하면 실수형으로 나오니까 int형으로 형변환 해준다. 

 

 money는 사용자가 입력한 값이 들어있는 변수다. 배열의 요소값으로 나눠줌으로써 다음 환산할 단위의 돈을 계산할 수 있게 한다. 말로 하니까 어려운데, 위 설명처럼 m에 50000으로 나눈 뒤 몫을 저장했다면 money에는 나머지를 저장한다. money에는 15123이 저장된다. 이렇게 하면 다음 환산할 단위인 10000원 권을 계산할 수 있다. 

 

 

 


 

 

7. 크기가 10인 배열에 랜덤한 값을 저장하고 평균 구하기

public class ex7 {
	public static void main(String[] args) {
		int n[]= new int[10];
		int sum=0;
		
		//배열 값 랜던 삽입
		for(int i=0; i<10; i++) {
			n[i]=(int)(Math.random()*10+1);  //0-1사이의 수를 랜던으로 반환
			sum+=n[i];
		}
		
		System.out.print("랜덤한 정수들 : ");
		for(int i= 0; i<10; i++) 
			System.out.print(n[i]+" ");
		
		System.out.println();
		System.out.println("평균은 "+(double)sum/n.length);
		
	}
}

 python의 random.random()함수와 유사한 모양. 1-10사이의 정수를 넣기 위해 *10하고 +1해줬다. 

 

 

 


 

 

 

8. 사용자가 입력한 사이즈의 배열에 같은 수가 없게 랜덤한 수 저장하기 ※

import java.util.Scanner;

public class ex8 {
	public static void main(String[] args) {
		Scanner s= new Scanner(System.in);
		
		//사용자가 입력한 값의 크기만큼의 배열 생성
		System.out.print("정수 몇 개?(100 이하) : ");
		int count=s.nextInt();
		int num[]=new int[count];
		
		//값 삽입 
		for(int i=0; i<count; i++) {
			num[i]=(int)(Math.random()*100+1);
			
			if(i>0) {
				for(int j=0; j<i; j++) {  //기존 배열에 있는 값일 경우 다시 초기화
					if(num[i]==num[j]) {
						num[i]=(int)(Math.random()*100+1);
						j--;   //새로 들어온 값이 또 num[j]와 동일하지 않은지 검사
					}
				}
			}
		}
	
		//값 출력
		for(int i=0; i<count; i++) {
			System.out.print(num[i]+"   ");
			if((i+1)%10==0)  //10개 기준으로 띄어쓰기
				System.out.println();
		}
		
		s.close();
	}
}

 이거는 솔직히 풀어놓고 맞는 코드인지 잘 모르겠다. 일단 16줄 for문 안에 if(i>0)에서 i는 배열의 인덱스 번호를 의미한다. 처음 배열에 저장되면 중복된 수인지 아닌지 비교할 요소가 없으므로 0보다 클 것을 조건으로 걸었다. 

 

 그 안의 for문의 j역시 인덱스 번호다. num[i]에 저장된 값이 기존의 배열에 저장된 값과 동일한지 순회하는 역할을 한다. 그리고 만약에 기존에 저장된 값과 랜덤으로 삽입된 값이 동일하면 새로운 랜덤 수를 저장하게 하고, 이렇게 새로 랜덤 수를 저장했는데 또 동일한 수가 저장될 수도 있으며로 j--를 해서 새로 저장한 수를 다시 확인한다. 

 

 

<추가> 깔끔하게 출력하는 법

		//출력
		for(int i=0; i<num; i++) {
			System.out.printf("%3d", array[i]);
			if((i+1)%10==0) System.out.println(); //10줄 마다 줄바꿈
		}
		

 

 

 


 

 

9. 2차원 배열 출력

public class ex9 {
	public static void main(String[] args) {
		int array[][]=new int[4][4];
		
		//랜덤 값 삽입
		for(int i=0; i<array.length; i++) {
			for(int j=0; j<array.length; j++) 
				array[i][j]=(int)(Math.random()*10+1);
		}
		
		//2차원 배열 출력
		for(int i=0; i<array.length; i++) {
			for(int j=0; j<array.length; j++) 
				System.out.print(array[i][j]+ "  ");
			System.out.println();
		}
		
	}
}

 

 

 


 

 

 

10. 2차원 배열에 6개의 0을 삽입 ※ 

public class ex10 {
	public static void main(String[] args) {
		int num[][]=new int[4][4];
		
		//배열 값 삽입
		for(int i=0; i<num.length; i++) {
			for(int j=0; j<num[0].length; j++) {
				if((i+j)%3==0)
					num[i][j]=0;
				else
					num[i][j]=(int)(Math.random()*10+1);
			}
		}
		
		//출력
		for(int i=0; i<num.length; i++) {
			for(int j=0; j<num[0].length; j++) 
				System.out.print(num[i][j]+ "   ");
			System.out.println();
		}
		
	}
}

 이거는 어케 푸는 지는 모르겠는데. 일단 4x4 배열이라 했을 때, 총 16개의 원소가 나온다. 행의 인덱스 번호와 열의 인덱스 번호를 합쳐서 3으로 나누어 떨어지는 경우는 (0,0), (0,3), (1,2), (2,1), (3,0), (3,3) 총 6개 밖에 없다. 이렇게 인덱스 번호를 정해서 풀었는데 인덱스도 랜덤하게 풀 수 있는 방법이 있을까?

 

 

 


 

 

 

11. Integer.ParseInt()

 

public class Average {
	public static void main(String[] args) {
		int sum=0;
		
		for(int i=0; i<args.length; i++) {
			sum+=Integer.parseInt(args[i]); //문자열로 입력받음
		}
		
		System.out.println("평균 : "+sum/args.length);
	}
}

 자바 코드 돌릴 때 누르는 초록색 버튼을 확장해서 보면 run configurations라고 있다. 거기에서 argument에 인자값을 넣으면 args 배열에 공백 기준으로 잘려서 저장된다. Integer.ParseInt(args[i])해서 인자값을 가져올 수 있다. 

 

 Integer.ParseInt()는 문자열을 정수형으로 바꾸는 함수다. argument에 값을 직접 삽입하면 문자열로 받아서 사용하는 듯. 

 

 

 


 

12. add 정수형만 입력받기

public class Add {
	public static void main(String[] args) {
		int sum=0;
		
		for(int i=0; i<args.length; i++) {
			try {
				sum+=Integer.parseInt(args[i]); //문자열로 입력받음
			}catch(Exception e) {
				continue;
			}
		}
		
		System.out.println("합 : "+sum);
	}
}

 이건 어떻게 정수형만 입력 받을 수 있을까 엄청 궁리했다. sizeof해서 자료형에 따른 바이트 수를 조사할까 했는데 자바에서는 sizeof가 없다고 한다. 결국 구글링 햇는데 예외 처리 try-catch로 깔끔하게 풀었더라..

 

 

 


 

 

13.  369게임

public class ex13 {
	public static void main(String[] args) {
		int n10, n1;
		
		//1-99 
		for(int i=1; i<=99; i++) {
			n10=i/10; n1=i%10;
			
			if(n10!=0 && n10%3==0) { //10의자리가 	0이 아니고 3의 배수일 때
				if(n1!=0 && n1%3==0)
					System.out.println(i+"박수 짝짝");
				else if(n1==0)
					System.out.println(i+"박수 짝");
				
			}else {  //10의 자리가 0일 때
				if(n1!=0 && n1%3==0)
					System.out.println(i+"박수 짝");
			}
				
		}
		
	}
}

 고려한 사항

1. 10의 자리가 0인 경우

2. 1의 자리가 0인 경우

 

 이 두 가지 경우는 3으로 나눠도 나머지가 0이니까 1의 자리 수가 출력될 때(1-9), 1의 자리 수가 0인 경우(10, 20 등) 때도 출력된다. 그래서 조건문으로 모두 걸러버림. 

 

 

 


 

 

14. 과목과 과목 성적이 짝을 이루도록 

import java.util.Scanner;
public class ex14 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		String course[]= {"Java", "C++", "HTML5", "컴퓨터 구조", "안드로이드"};
		int score[] = {95, 88, 76, 62, 55};
		String name="";
		
		while(true){
			System.out.print("과목 이름>>");
			name=s.next();
			
			if(name.equals("그만"))
				break;
			
			for(int i=0; i<course.length; i++) {
				if(course[i].equals(name)) {
					System.out.println(course[i]+"의 점수는 "+score[i]);
					break;
				}
				
				if(i==course.length-1)
					System.out.println("없는 과목입니다.");
			}
		}
		
		s.close();
	}
}

 

 

 

 

 


 

 

 

15. 정수만 입력 받기

import java.util.Scanner;
import java.util.InputMismatchException;
public class ex15 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int x, y;
		
		while(true) {
			try {
				System.out.print("곱하고자 하는 두 수 입력 : ");
				x=s.nextInt();
				y=s.nextInt();
				
				System.out.println(x+" x "+y+" = "+x*y);
				break;
			}catch(InputMismatchException e){
				System.out.println("실수는 입력하면 안 됩니다.");
				s.nextLine();  //Scanner에 이미 입력된 키 모두 제거
			}
		}
		
		s.close();
	}
}


//tlqkf 이건 아니잖아요...

 12번과 유사한 문제. catch문에 s.nextLine() 안 써줬다가 무한 반복 났다. 힌트에 nextLine() 호출하라고 해서 x.nextLine(), y.nextLine() 썻다가 아주 낭패를 봤다. 

 

 

 


 

 

16. 가위 바위 보 게임

import java.util.Scanner;
public class ex16 {
	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		String[] str= {"가위", "바위", "보"};
		String user;
		
		System.out.println("컴퓨터와 가위 바위 보 게임을 합니다.");
		
		while(true) {
			int n=(int)(Math.random()*3);
			System.out.print("가위 바위 보!>>");
			user=s.next();
			
			if(user.equals("그만"))
				break;
			
			System.out.print("사용자= "+user+", 컴퓨터= "+str[n]+", ");
			if(str[n].equals("가위")) {
				if(user.equals("가위"))
					System.out.println("비겼습니다.");
				else if(user.equals("바위"))
					System.out.println("사용자가 이겼습니다.");
				else
					System.out.println("컴퓨터가 이겼습니다.");
			}else if(str[n].equals("바위")) {
				if(user.equals("바위"))
					System.out.println("비겼습니다.");
				else if(user.equals("보"))
					System.out.println("사용자가 이겼습니다.");
				else
					System.out.println("컴퓨터가 이겼습니다.");
			}else {
				if(user.equals("보"))
					System.out.println("비겼습니다.");
				else if(user.equals("가위"))
					System.out.println("사용자가 이겼습니다.");
				else
					System.out.println("컴퓨터가 이겼습니다.");
			}
	
		}
		
		System.out.println("게임을 종료합니다...");
		
		s.close();
	}
}


 연구실 친구는 이상한 거 입력했을 때 다시 입력하라고도 썼는데 나는 잘못 입력하면 다 컴퓨터가 이긴 걸로 햇다. 저거 클래스로 짜도 괜찮을 것 같은데 자바에서는 클래스.. 어떻게 쓰는 지 모르겟따. 

 

 


 

 2장은 진짜 쉽게 푼 것 같은데 3장부터 난이도가 무섭다