카테고리 없음

MAGIC CARD

오쟝 2024. 3. 21. 21:30

매직카드! 마술 같지만 사실 코딩과 관련이 있다는 사실~!

 

DS 시간에 배운 알고리즘 표현법을 사용해 코드를 짜는 방법을 생각해봅시다!

1. 사용자로부터 몇 개의 숫자에서 고를 것인지를 n에다가 입력받습니다!

2. log 함수를 사용해 몇 번의 반복이 필요한지를 계산하고, 배열을 선언해줍니다.

3. log만큼 반복합니다.

4. 1, 2, 4, 8...을 2진수로 표현하면 (1), (10), (100), (1000)과 같이 규칙이 존재합니다. 이 규칙을 바탕으로 & 연산자를 사용해 1부터 n까지 수를 비교해 & 연산 결과가 수와 같다면 출력합니다.

5. 출력한 수에 생각한 숫자가 있다면 y를, 없다면 n를 입력받아 배열에 참일 경우 1을, 거짓을 경우 0을 입력받습니다.

6. 반복문이 종료된 후 배열의 이진수를 계산해 출력해줍니다.

 

import java.util.Scanner;

class MagicCard {
	public static void main(String args[]){
    	Scanner sc = new Scanner(System.in);
        
        System.out.print("원하는 숫자를 입력해 주세요 > 1~");
        int num = sc.nextInt();
        int logNum = (int)(Math.log(num)/Math.log(2)) + 1; // log를 사용해 2의 몇 승인지 계산
        int arrNum[] = new int[logNum];
        
        System.out.println("매직카드로 맞출 숫자를 생각해 주세요");
        
        int k = 1, cnt = 0, res = 0;
        for(int i = 0; i<logNum; i++){
        	System.out.println((i+1)+"번째 카드");
            for(int j = 1; j<=num; j++){
            	if((k&j) == k) {
            		System.out.print(j + "\t");
                    cnt++;
                    if(cnt%4 == 0) System.out.println();
            	}                
            }
            
            System.out.println();
            System.out.print("생각하신 숫자가 있나요? (y/n) ");
            String answer = sc.next();
            
            if(answer.equals("y")) arrNum[i] = 1;
            else arrNum[i] = 0;
            
            cnt = 0;
            k *= 2;
        }
        
        k = 1;
        
        for(int i = 0; i<arrNum.length; i++){
        	if(arrNum[i] == 1) res += k;
            k *= 2;
        }
        
        System.out.println("생각하신 숫자는 " + res + "입니다");
    }
}

 

- & 연산자는 2진수가 둘 다 1일 때만 1이 됩니다.

예를 들어 24의 2진수는 (0b011000), 19의 2진수는 (0b010011)입니다.

011000

010011에 & 연산자를 사용하게 되면 010000이 나오게 됩니다. 

 

매직카드는 생각한 수가 19라면 19를 2의 0승이 모두 1인 수부터 2의 4승이 모두 1인 수까지 보여주면서 19의 2진수를 알아내는 원리입니다.

 

해설을 하고 나니 생각보다 간단한 코드 같습니다! 

 

그럼 20000!~