티스토리 뷰

참고: 이데일리 코딩 챌린지 기출 문제 자료실 https://coding.edaily.co.kr/bbs/board.php?bo_table=question


[1 문제내용] 피보나치 수열에서의 특정한 항은 앞의 두 항을 더하여 계산합니다. 이 때 첫 번째 항과 두 번째 항은 1이며, 세 번째 항부터는 이전의 두 항을 더하여 나타냅니다. 예를 들어 첫 번째 항부터 일곱 번째 항까지를 나열하면 다음과 같습니다. 1, 1, 2, 3, 5, 8, 13... 자연수 N이 주어졌을 때, N번째 피보나치 수를 출력하는 프로그램을 작성하세요. [입력조건] 첫째 줄에 자연수 N이 주어집니다. (1 <= N <= 35) [출력조건] N번째 피보나치 수를 출력합니다. [입력예시 1] 3 [출력예시 1] 2 [입력예시 2] 8 [출력예시 2] 21 [풀이]
public static void main(String[] args) {

System.out.println("N번째 피보나치 수에서 N을 입력하세요.(1 <= N <= 35)");
Scanner sc = new Scanner(System.in); //입력객체 생성
int n = sc.nextInt(); //키보드 입력 정수값

int[] fibonacci = new int[n+1]; //피보나치 수열 배열 n개의 방

fibonacci[0] = 1;
fibonacci[1] = 1;

for(int i=0; i+2 < n; i++) {
fibonacci[i+2] = fibonacci[i+1] + fibonacci[i];
}
System.out.println(fibonacci[n-1]); //N번째 피보나치 수를 출력
}

[2 문제내용]

은진이는 심심할 때마다 달력을 보는 습관이 있습니다.

 달력을 보는 습관 때문에 어느 순간 달력과 물아일체가 된 은진이는 모든 년도에 대한 달력을 통째로 외워버렸습니다.

우리는 은진이를 능가하기 위해 년도와 월이 주어졌을 때 해당 월의 마지막 일자를 출력하는 프로그램을 만들고자 합니다.

 예를 들어 2018년 10월이라는 입력이 들어왔을 때 31일이라는 값을 출력해야 합니다.


[입력조건]

년도와 월이 입력됩니다. 이 때 년도는 항상 1보다 크거나 같고 10,000보다 작거나 같은 정수입니다.

[출력조건]

해당 년도 및 해당 월의 마지막 일자를 출력합니다.


[입력예시 1]

2018 10

[출력예시 1]

31


[입력예시 2]

2012 2

[출력예시 2]

29


[풀이]


public static void main(String[] args) {

System.out.println("년도와 월을 입력하시오.입력 순서대로 공백을 기준으로 구분되어 정해집니다."
+ "\n" + "년도는 항상 1보다 크거나 같고 10,000보다 작거나 같은 정수입니다.");

Scanner sc = new Scanner(System.in); //입력객체 생성
String input = sc.nextLine(); //키보드 입력 정수값

String inputArr[] = input.split(" ");

int year = Integer.parseInt(inputArr[0]);
int month = Integer.parseInt(inputArr[1]);
int day = 1;

Calendar cal = Calendar.getInstance(); //캘린더 객체 생성

cal.set(year, month-1, day); //월은 -1해줘야 해당월로 인식

int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 특정월의 마지막 날짜

System.out.println(lastDay);
}

[3 문제내용]

일반적으로 두 소수의 곱을 A라고 할 때 A를 보고 역으로 두 소수를 유추해내는 것은 굉장히 어려운 것으로 알려져 있습니다.

 이러한 성질은 암호학에서 다방면으로 활용되고 있습니다.

다만 두 소수의 곱 A가 충분히 크지 않은 숫자라면 역으로 두 소수를 유추해내는 것은 어려운 일이 아닙니다.

 따라서 어떠한 숫자 A가 주어졌을 때

 두 소수의 곱으로 나타낼 수 있으면 두 소수를 오름차순으로 출력하고, 나타낼 수 없으면 IMPOSSIBLE을 출력하는 프로그램을 작성하세요.


[입력조건]

첫째 줄에 정수 A가 주어집니다. (1 <= A <= 10,000,000)

[출력조건]

정수 A를 두 소수의 곱으로 나타낼 수 있으면

 두 숫자를 오름차순으로 출력합니다.

 가능한 소수의 쌍이 많은 경우 가장 작은 소수와의 곱을 출력합니다.

 만약 정수 A를 두 소수의 곱으로 나타낼 수 없다면 IMPOSSIBLE을 출력합니다.


[입력예시 1]

15

[출력예시 1]

3 5


[입력예시 2]

20

[출력예시 2]

IMPOSSIBLE


[입력정답 확인용 1]

5984085

[출력정답 확인용 1]

IMPOSSIBLE


[입력정답 확인용 2]

4000

[출력정답 확인용 2]

IMPOSSIBLE


[입력정답 확인용 3]

1699847

[출력정답 확인용 3]

17 99991


[입력정답 확인용 4]

499385

[출력정답 확인용 4]

5 99877


[입력정답 확인용 5]

4337256

[출력정답 확인용 5]

IMPOSSIBLE


[풀이]


/**
* 소수는 약수가 1과 자신뿐인 수. 1은 소수가 아니다.
* a x b = N
* a = 2, 3, 4... (N % a = 0)일때 a는 소수인가
* a가 소수가 아니면 바로 IMPOSSIBLE을 출력
* a가 소수면 b는 소수인지 체크
* b가 소수이면 ab 두 소수를 오름차순으로 출력
*/
int a;
int b = 0;


System.out.println("정수 N을 입력하세요. (1 <= N <= 10,000,000)");
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();

boolean a_isPrime = false; // a 소수 구분자(소수=ture)
boolean b_isPrime = false; // b 소수 구분자(소수=ture)

for (a=2; a<N; a++) {
if(N%a == 0) {
for (int i=2; i<a; i++) { //a 1과 자신을 제외하고, 자신보다 작은 수로 나누어지면 소수가 아니다.
if(a%i == 0) {
a_isPrime = false;
break;
} else {
a_isPrime = true;
}
}

if(a_isPrime) {
b = N / a;
for (int i=2; i<b; i++) { //b 1과 자신을 제외하고, 자신보다 작은 수로 나누어지면 소수가 아니다.
if(b%i == 0) {
b_isPrime = false;
break;
} else {
b_isPrime = true;
}
}

if(a_isPrime && b_isPrime) {
System.out.println("a=" + a + ", b=" + b);
break;
}
}
}
}

if(!(a_isPrime && b_isPrime)) {
System.out.println("IMPOSSIBLE");
}

[4 문제내용]

로또왕 산이는 매주 로또를 구입합니다.

매주 로또를 구입하다 보니 자신이 선택한 로또 번호와 당첨 번호를 매칭하는 것도 귀찮은 일이 되어버렸습니다.

그래서 산이는 당첨 번호 및 보너스 번호와 자신의 로또 번호가 주어졌을 때

당첨 여부를 빠르게 확인하는 프로그램을 작성하고자 합니다.

당첨번호는 6개, 보너스 번호는 1개가 주어지며 산이가 선택한 로또 번호는 총 6개입니다.

로또의 당첨 여부를 판별하는 로직은 다음과 같습니다.

1등: 당첨번호가 6개 모두 일치할 때

2등: 당첨번호 5개와 보너스 번호가 일치할 때

3등: 당첨번호 5개가 일치할 때

4등: 당첨번호 4개가 일치할 때

5등: 당첨번호 3개가 일치할 때

이외의 모든 경우는 꽝으로 분류합니다.


[입력조건]

첫째 줄에 로또의 당첨번호 6개 및 보너스 번호가 공백을 기준으로 주어집니다.

이 때 각 번호는 1보다 크거나 같고 45보다 작거나 같은 정수입니다.

둘째 줄에 산이가 선택한 로또 번호 6개가 공백을 기준으로 주어집니다.

이 때 각 번호는 1보다 크거나 같고 45보다 작거나 같은 정수입니다.

[출력조건]

산이의 로또 당첨 여부를 출력합니다.

이 때 1등은 1, 2등은 2, 3등은 3, 4등은 4, 5등은 5, 꽝은 -1을 출력합니다.


[입력예시 1]

15 3 44 45 7 5 6

3 5 6 7 44 15

[출력예시 1]

2


[입력예시 2]

15 3 44 45 7 5 6

45 44 43 42 41 40

[출력예시 2]

-1


[입력정답 확인용 1]

15 3 44 45 7 5 6

1 2 3 4 5 7

[출력정답 확인용 1]

5


[입력정답 확인용 2]

1 2 3 4 5 6 7

1 2 3 4 5 6

[출력정답 확인용 2]

1


[입력정답 확인용 3]

43 45 1 8 3 7 5

4 5 1 8 3 43

[출력정답 확인용 3]

4


[입력정답 확인용 4]

43 4 1 8 3 7 5

4 5 1 8 3 43

[출력정답 확인용 4]

2


[입력정답 확인용 5]

7 4 5 8 10 11 15

1 2 3 4 5 6

[출력정답 확인용 5]

-1


[풀이]

Scanner sc = new Scanner(System.in);
String lottoStr; // 첫번째로 로또의 당첨번호 6개와 보너스 번호 문자열
String inputStr; //산이가 선택한 로또 번호 6개 문자열
int[] lottoArr; // 첫번째로 로또의 당첨번호 6개와 보너스 번호 1
int[] inputArr; //산이가 선택한 로또 번호 6
String tempArr[];

System.out.println("첫번째로 로또의 당첨번호 6개와 보너스 번호를 공백을 기준으로 입력하세요.");
lottoStr = sc.nextLine();
tempArr = lottoStr.split(" ");
lottoArr = new int[tempArr.length];
for(int i=0; i<lottoArr.length; i++) {
lottoArr[i] = Integer.parseInt(tempArr[i]);
}

System.out.println("두번째로 산이가 선택한 로또 번호 6개를 공백을 기준으로 입력하세요.");
inputStr = sc.nextLine();
tempArr = inputStr.split(" ");
inputArr = new int[tempArr.length];
for(int i=0; i<inputArr.length; i++) {
inputArr[i] = Integer.parseInt(tempArr[i]);
}

int count = 0; // 번호 당첨 갯수
for(int i=0; i<inputArr.length; i++) {
for(int j=0; j<lottoArr.length-1; j++) { //보너스 로또 번호 제외
if(inputArr[i] == lottoArr[j]) {
count++;
}
}
}

switch (count) {
case 6: //보너스 번호 제외한 당첨번호가 6개 모두 일치할 때 1
System.out.println("1");
break;

case 5:
boolean isSecond = false;
for(int i=0; i<inputArr.length; i++) {
if(inputArr[i] == lottoArr[lottoArr.length]) { //보너스 번호 당첨
isSecond = true;
break;
}
}

if(isSecond) {
System.out.println("2"); //2
} else {
System.out.println("3"); //3
}

break;

case 4: //보너스 번호 제외한 당첨번호 4개가 일치할 때 4
System.out.println("4");
break;

case 3: //보너스 번호 제외한 당첨번호 3개가 일치할 때 5
System.out.println("5");
break;

default: //
System.out.println("-1");
break;
}