가뜩이나 환절기에 콧물 시큰시큰이라 머리가 띵한데 Java 실력 체크를 위한 시험을 보게 되었습니다.
다들 풀 수 있는 수준으로 나온다고 하지만, 모두에게 그러리라는 법은 없기 때문에, 넉넉한 시간에도 불구하고 끙끙대시는 분들이 많았습니다.
문제는 총 8문제였습니다.
Table of Contents
Java 문제 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의 배수가 아닌 수를 모두 더하라.
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인 경우를 모두 구하라.
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 방정식의 해가 될 수 있는 모든 경우를 구하라.
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. 글자를 한 글자씩 읽어서 숫자인지 판별하라.
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이라서 더 큰 문제긴 하죠.