[네이버클라우드 캠프/1주차] 369 게임
3/15(수) 네이버클라우드 캠프 시작 4일 차
과제로 진행했던 369 게임의 소스코드를 작성하며 얻은 인사이트를 정리하기 위해 블로그 글을 남깁니다.
❓문제 : <369 게임>
1~99 사이의 정수를 입력받아 3, 6, 9 중 하나가 있다면 "박수짝", 두 개가 있다면 "박수짝짝"을 출력합니다.
13 // 박수짝
36 // 박수짝짝
<나의 풀이>
아래는 제가 문제를 풀이한 방법입니다.
규칙을 찾아봅시다.
1. 30, 60, 90번대 수
30 ~ 39
60 ~ 69
90 ~ 99
// 30 <= n && n < 40
// 60 <= n && n < 70
// 90 <= n && n < 100
1-1. 그중 3, 6, 9가 2개씩 존재하는 수
33 63 93
36 66 96
39 69 99
// 그 외 30으로 나눴을 때 나머지가 3 ,6 ,9
2. 1번 제외 3, 6, 9가 1개씩 존재하는 수
3 13 23 43.. 83
6 16 26 46.. 86
9 19 29 49.. 89
// 그 외 10으로 나눴을 때 나머지가 3, 6, 9
단순히 생각하여 각 자릿수에 3, 6, 9 중 하나가 존재하는지 존재하지 않는지를 확인하면 되는데...
처음엔 미처 생각하지 못했습니다..
아래는 위의 규칙을 기반으로 작성한 소스코드입니다.. (절대 참고하지 마세요..)
import java.util.Scanner;
public class _00_homework {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("1`99 정수 입력 > ");
int n = sc.nextInt();
if(1 <= n && n <= 99) {
if((30 <= n && n < 40)||(60 <= n && n < 70)||(90 <= n && n < 100)) {
if(n%30 == 3 || n%30 == 6 || n%30 == 9) {
System.out.println("박수짝짝");
} else {
System.out.println("박수짝");
}
} else if(n%10 == 3 || n%10 == 6 || n%10 == 9) {
System.out.println("박수짝");
} else {
System.out.println("3, 6, 9를 찾을 수 없습니다.");
}
} else {
System.out.println("1`99 사이 정수를 입력하지 않았습니다.");
}
}
}
최적화된 방법은 아닌 것 같습니다. (속상... ㅠㅠ)
생각을 다시 전환시켜, 각 자릿수에 3, 6, 9가 들어있는지를 확인하겠습니다.
int형으로 입력받았을 때 각 자릿수를 확인하기 위해서는 나누기(/)와 나머지(%)를 활용하는 것이 좋겠습니다.
<최종 소스코드>
import java.util.Scanner;
public class _00_homework {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("1`99 정수 입력 > ");
int n = sc.nextInt();
int tens = n / 10; // 십의 자리
int units = n % 10; // 일의 자리
boolean clap = false;
if(tens == 3 || tens == 6 || tens == 9) {
System.out.print("박수짝");
clap = true;
}
if(units == 3 || units == 6 || units == 9) {
System.out.print(clap? "짝" : "박수짝");
}
}
}
int 뿐만 아니라, boolean, if문, 삼항 연산자까지... 지금까지 배운 내용이 모두 들어가 있는 좋은 과제였던 것 같습니다.
위의 코드는 입력되는 값이 1`99라는 범위로 정해져 있을 때에는 가장 최적화된 코드라고 생각합니다.
그러나 값을 무한대로 받을 때에는
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class _00_homework {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("정수 입력 > ");
String n = br.readLine();
System.out.print("박수");
for(int i = 0; i < n.length(); i++) {
char c = n.charAt(i);
if(c == '3' || c == '6' || c == '9') {
System.out.print("짝");
}
}
br.close();
}
}
입력 시 String 타입으로 받아, charAt(i)를 통해 각 자릿수의 값이 3, 6, 9와 중복이 되는지 확인해 주는 것이 좋습니다.
특히 입력되는 값이 무한대일 경우에는 BufferedReader를 이용하여 최적화시키는 것이 효율적입니다.
Scanner는 입력받은 데이터를 분석하여 처리하기 위해 많은 연산을 수행하기 때문에,
입력이 빈번하게 일어날 경우 성능 저하가 발생할 수 있습니다.
따라서 BufferedReader로 작성한 코드도 참고하시는 것도 좋을 것 같습니다!