가뜩이나 환절기에 콧물 시큰시큰이라 머리가 띵한데 Java 실력 체크를 위한 시험을 보게 되었습니다.

다들 풀 수 있는 수준으로 나온다고 하지만, 모두에게 그러리라는 법은 없기 때문에, 넉넉한 시간에도 불구하고 끙끙대시는 분들이 많았습니다.

문제는 총 8문제였습니다.

Java 문제 1. 일의 자리를 1로 바꾸는 코드를 작성하라.

문제 1

public class Exercise1 {

	public static void main(String[] args) {
		int num = 333;
		int num2 = (int)Math.round((double)(Math.floor((float)num*0.1f)))*10+1;
		System.out.println(num2);
	}

}

사실 num / 10 * 10이 훨씬 쉽긴 합니다만, 나름 이유가 있어서라고 생각했는데… 풀고나니 참 쓸데 없는 짓을 했구나 싶은 부분입니다.

어떤 분은 String으로 바꾸고 치환하고 Integer.parseInt() 했다고 하시네요. 아… 제가 머리가 굳었나봅니다. 세상은 참신한 방법이 널리고 널렸어요.

Java 문제 2. 1에서 20까지의 정수 중 2와 3의 배수가 아닌 수를 모두 더하라.

문제 2

public class Exercise2 {

	public static void main(String[] args) {
		int sum = 0;
		for(int i = 1; i <= 20; i++) {
			sum += (i % 2 == 0 || i % 3 == 0) ? 0 : i;
		}
		System.out.println("2의 배수도, 3의 배수도 아닌 수의 합: "+sum);
	}

}

물론 if문을 쓰시는 분이 훨씬 더 많았을 겁니다. 저는 이상한 길을 좋아하거든요.

Java 문제 3. 주사위 두 개를 던져 그 합이 6인 경우를 모두 구하라.

문제 3

public class Exercise3 {

	public static void main(String[] args) {
		for(int i = 1; i < 7; i++) { if(6-i > 0) {
				System.out.printf("%d, %d\n", i, 6-i);
			}
		}
	}

}

for문 중첩으로 돌릴 수 있냐 궁금해서 낸 거 같았는데, 퍼포먼스 고려하면 이게 훨씬 낫죠. 당연히 출제자의 의도에 반하는 답을 내놨습니다.

for(int i = 1; i < 7; i++) {
			for(int j = 1; j < 7; j++) {
				if(i+j==6){
					System.out.printf("%d, %d\n", i, 6-i);
				}
			}
		}

아마 이런 그림을 원하셨겠죠.

Java 문제 4. 2x+4y=10 방정식의 해가 될 수 있는 모든 경우를 구하라.

문제 4

public class Exercise4 {
	public static void main(String[] args) {
		//2x+4y=10
		for(int x = 0; x <= 10; x++) { int y = (5-x) / 2; float fy = (5-x) / 2.0f; if(y*100==fy*100) { if(y>=0 && y<=10) {
					System.out.printf("x=%d, y=%d\n",x,y);
				}
			}
		}
	}
}

실제로 방정식을 풀어버렸지만 기껏 반복문을 쓰는데 반복문의 하나하나 대입하는 속성에 충실하지 못했습니다. 출제자의 의도에 맞게 또 수정해보겠습니다.

for(int x = 0; x <= 10; x++){
			for(int y = 0; y <= 10; y++) {
				if(2*x+4*y==10) {
					System.out.printf("x=%d, y=%d\n",x,y);
				}
			}
		}

Java 문제 5. 글자를 한 글자씩 읽어서 숫자인지 판별하라.

문제 5

public class Exercise5 {

	public static void main(String[] args) {
		String value = "12a34";
		boolean isNumber = true;
		for(int i = 0; i < value.length(); i++) {
			char c = value.charAt(i); //방법1
			try {
				Integer.parseInt(String.valueOf(c));
			} catch(NumberFormatException e) {
				isNumber = false;
				break;
			}
		}
		System.out.println(value+"는 "+(isNumber?"숫자입니다.":"숫자가 아닙니다."));
	}

}

Java 문제 6. 1부터 100까지의 정수 중 임의의 수를 지정하고, 사용자가 맞추게 하여 그보다 높은지 낮은지만 출력하고, 맞추면 정답 표시 후 종료하는 코드를 작성하라.

public class Exercise6 {

	public static void main(String[] args) {
		int answer = (int)Math.round(Math.random() * 100 + 1);
		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();
			
			if(input == answer) {
				System.out.println("맞췄습니다.");
				System.out.printf("시도횟수는 %d번입니다.\n",count);
				break;
			} else {
				System.out.println(input > answer ? "더 작은 수를 입력하세요." : "더 큰 수를 입력하세요.");
			}
		}while(true);	
		
	}
}

반복문을 유일하게 잘 쓰는 문제였는데 사실 손 댈 부분은 많지 않았습니다. if 분기를 최소화하느라 또 저는 이상한 else 문을 쓰긴 했지만, 핵심은 break를 하냐 안 하냐에 따라 소스의 간결함이 크게 차이난다는 점이 아닐까 싶습니다. while(true)가 제시되어 있던 문제라 문제를 바꾸지 않는 이상 더 나은 대안이 없던 상황이었거든요.

random() * 99로 했다가 * 100으로 수정합니다. random()은 1.0이 절대 안 나온다는군요.

Java 문제 7. 주어진 조건을 만족하는 Student class를 작성하라.

public class Student {
	private String name;
	private int ban;
	private int no;
	private int kor;
	private int eng;
	private int math;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getBan() {
		return ban;
	}
	
	public void setBan(int ban) {
		this.ban = ban;
	}
	
	public int getNo() {
		return no;
	}
	
	public void setNo(int no) {
		this.no = no;
	}
	
	public int getKor() {
		return kor;
	}
	
	public void setKor(int kor) {
		this.kor = kor;
	}
	
	public int getEng() {
		return eng;
	}
	
	public void setEng(int eng) {
		this.eng = eng;
	}
	
	public int getMath() {
		return math;
	}
	
	public void setMath(int math) {
		this.math = math;
	}

	public Student(String name, int ban, int no, int kor, int eng, int math) {
		this.name = name;
		this.ban = ban;
		this.no = no;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}	
	
	public int getTotal() {
		return kor + eng + math;
	}
	
	public double getAverage() {
		return getTotal() / 3.0d;
	}
}

private 접근제어자와 public을 구분하는 것이 중요합니다. 또 문제 8과 관련하여 무작정 average나 total 필드를 추가하면 필히 막막해지기 마련입니다. Getter나 Setter, 생성자는 eclipse의 Source 메뉴에서 Generate하면 손쉽게 만들 수 있습니다. 모두 함수라는 사실을 기억하고, 접근하면 크게 당황할 일이 없습니다. return이라든가 대입이라든가, 함수 호출의 연쇄를 통해 충분히 극복 가능한 문제죠.

Java 문제 8. 위 Student를 활용하여 Total과 Average를 주어진 코드로 구할 수 있도록 하라.

public class Exercise8 {

	public static void main(String[] args) {
		Student s = new Student("홍길동",1,1,100,60,76);
		System.out.println("이름:"+s.getName());
		System.out.println("총점:"+s.getTotal());
		System.out.println("평균:"+s.getAverage());
	}

}

잊어먹을 리는 없지만, 이런 거 정리해두는 것은 나쁘지 않은 것 같습니다.

그보다 4시간이나 있다보니 또 시간과 공간의 방에 격리된 느낌이네요. 책을 읽으면서 심신을 위로하는 것이 유일한 답인 것 같습니다.

그나저나 Web인 Spring은 언제 쯤 마무리할런지... 사실 해도해도 끝이 안 나고 티가 안 나는 게 Web이라서 더 큰 문제긴 하죠.