티스토리 뷰

반응형

www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

 


 문제

 입력

 출력

 예제 입출력

 알고리즘 분류

  • 브루트 포스 알고리즘

 


 

 문제 접근 과정

 

저번 시간에 풀었던 브루트 포스(brute force) 문제다.

☞brute 무식한 force 힘 -> 무식한 힘

완전 탐색 알고리즘

 

모든 경우의 수를 전부 다 탐색하고 (무식하게) 대입해 충족하는 값을 찾는 방법이다.

브루트 포스 알고리즘 설계의 가장 기본은 모든 영역을 전체 탐색하는 방법이다.(= 완전 탐색 알고리즘)

 

for문을 이용하여 처음부터 끝까지 전부 다 탐색하였다.

 


 

 문제 풀이

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // N의 값을 입력받는다.
        int N = in.nextInt();
        // M의 값을 입력받는다.
        int M = in.nextInt();

        //입력받은 N만큼 배열 arr[]를 생성한다.
        int[] arr = new int[N];

        //N개마다 각각 값을 입력받는다.
        for (int i = 0; i<N; i++) {
            arr[i] = in.nextInt();
        }

        //메서드 search를 이용해 문제에 접근한다.
        //메서드는 main함수 아래에 구현한다.
        int result = search(arr,N,M);

        //문제에서 원하는 값 result를 출력한다.
        System.out.println(result);
    }
    //메서드 search
    public static int search(int[] arr,int N,int M) {
        //결과값인 result 값 초기화
        int result =0;

        //첫번째 카드
        for (int i =0; i < N-2; i++) {
            //두번째 카드
            for(int j = i+1; j<N-1; j++) {
                //세번째 카드
                for(int k = j+1; k<N;k++) {

                    //세 수의 합 : add
                    int add = arr[i] + arr[j] + arr[k];

                    //딜러가 부른 숫자와 일치하면 add return
                    if(M == add) {
                        return add;
                    }

                    //그렇지 않다면 최대한 근접하게 result 값에 넣어준다.
                    if((result < add) && (add < M)) {
                        result =add;
                    }
                }
            }
        }

        //마지막엔 우리가 원하는 결과값인 result return
        return result;
    }
}

 

SEARCH문에서 FOR문 부분이 어려웠다.

첫 번째 카드에서 i=0이고 N-2까지만 탐색한다. 왜냐하면 두장을 더 뽑아야 하기 때문이다.

두 번째 카드에서는 j=i+1 , 그러니까 첫 번째 카드 다음장부터 N-1까지만 탐색한다. 한 장이 더 남았기 때문이다.

마지막 세번째 카드에서는 k=j+1, 두 번째 카드 다음장부터 N까지 탐색한다.

 

이 부분만 유의해서 보면 어렵지 않게 코딩할 수 있다.

 

 


 결과

 

 


 마무리

 

 

이번에 한번 코드에 주석을 넣어 한 줄씩 설명을 추가해봤다.

보기가 더 수월해졌다.

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함