아 진짜 얼마나 험난하고 힘든 단계였던가...!

 

자바로 만들기 시작한 건국대 포탈 api는..

 

서버를 사용하기 힘들어 스프링 부트로 갈아타서 api를 만들고..

 

그 api를 aws에 배포하려고 하니 maven이 말썽을 부렸고...

 

maven을 해결하니 크롬과 크롬 드라이버가 말썽을 부리고...

 

크롬과 크롬 드라이버를 해결하니 스프링 부트의 알 수 없는 빌드 실패가 계속해서 이어지고...

 

그래서 파이썬으로 갈아타서 다시 api를 만들고...

 

aws에 배포하려니 pip가 없고...

 

pip를 설치하고 나서 서버를 돌렸더니 탄력적 ip를 어떻게 써야하는지 모르겠고...

 

탄력적 ip 사용방법을 알게되었더니 접근이 안되고...

 

접근 안되는 이유를 찾고 접근 가능하게 했더니 ec2가 한글을 인식을 못하고..

 

ec2 언어 설정을 바꾸어 한글을 인식하게 바꾸었더니 이제는 python에서 인식을 못하고..

 

인식을 못하길래 불나는 구글링으로 굉장히 많은 인코딩 구문들을 추가해봤지만 안됐고...

 

그러던 중 python3에서는 한글을 잘 처리한다길래 python3로 돌렸더니 pip3로 설치한게 없어서 다시 pip3로 설치할 것들 설치하고...

 

설치하고 나서 api 호출을 해봤는데 no such element 오류가 나고...

 

왜 오류나는지 몰라가지고 리눅스 환경에 가서 크롬을 깔아가지고 html을 살펴보기도 하고...

 

한글이 문제인 것 같아서 try exception문으로 예외처리를 해줬는데 바뀐게 없어서 왜 그런가 봤고...

 

commit을 안한상태로 pull을 해서 변경사항이 저장이 안됐던 것이어서 commit해주고 pull하고...

 

다시 돌린 결과....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

 

드디어 성공했다...ㅠㅠㅠㅠㅠㅠㅠㅠㅠ

 

진짜 미친 듯이 힘들었다...ㅠㅠ

 

다음에 시간이 날 때 어떤식으로 서버에 파이썬을 배포했는지 참고자료를 정리하는 글을 올려야겠다.

아마 나처럼 삽질하는 사람들 많을 것이다.

 

어쨌든 고생했다 나!!!

2021년 8월 2일 월요일 - 벌써 8월이 됐네..


오늘 올려볼 문제는 2493번 탑 라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

백준 문제 사진

오늘은 백준을 둘러보다가 골드문제를 하나 발견해서 가지구 왔다.

슬슬 문제 찾는 레파토리가 떨어져간다...


입력 예제

백준 입력 예제


입력은 매우 단순한 문제이다.




풀이 및 코드


이 문제는 스택을 잘 사용해야 하는 문제다.


문제를 간략히 설명해보자면


  1. 입력으로 각 탑의 높이가 들어온다. (같은 높이의 탑은 없다.)
  2. 각 탑은 탑의 꼭대기에서 왼쪽으로 신호를 보낸다.
  3. 2에서 보낸 신호를 받을 수 있는 센서는 각 탑의 기둥에 부착되어있다. (탑의 높이만큼 길게 부착되어있다는 것)
  4. 이 때 가장 먼저 신호를 받는 탑의 위치가 어디인지 출력한다.

그러므로 스택에 각 탑의 위치(인덱스)를 넣고 비교하는 과정을 통해서 이 문제를 해결할 수 있다!


아직 헷갈릴 수 있으니 코드를 봐보자!


풀이코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());

        String[] input_arr = br.readLine().split(" ");
        int[] arr = new int[n];

        // 각 탑의 인덱스를 저장할 스택
        Stack<Integer> s = new Stack<Integer>();

        for(int i = 0; i < n; i++)
        {
            // string으로 받은 입력을 int형으로 바꿔주는 작업
            arr[i] = Integer.parseInt(input_arr[i]);

            // 만약 스택이 비었다면 (신호를 받을 수 있는 탑이 없다면)
            if(s.isEmpty())
            {
                // 0을 출력한다. (신호를 못 받는 경우 0 출력)
                bw.write("0 ");
            }
            // 스택이 비어있지 않다면
            else
            {
                // 아래 과정 반복
                while(true)
                {
                    // 스택이 비었다면
                    if(s.isEmpty())
                    {
                        // 0 출력하고 반복문 벗어나기
                        bw.write("0 ");
                        break;
                    }

                    // 스택에 들어있는 탑의 위치(인데스)에 있는 탑의 높이가 현재 탑의 높이보다 크다면
                    if(arr[s.peek()] > arr[i])
                    {
                        // 스택에 들어있는 탑의 위치 + 1을 출력하고 반복문을 벗어난다.
                        // 1 더해주는 것은 인덱스와 문제에서 원하는 답과의 차이 때문에 해준다.
                        bw.write((s.peek() + 1) + " ");
                        break;
                    }
                    // 스택에 들어있는 탑의 위치(인데스)에 있는 탑의 높이가 현재 탑의 높이보다 크지 않다면
                    else
                    {
                        // 스택에서 pop해준다.
                        s.pop();
                    }
                }
            }

            // 항상 스택에 현재 탑의 위치(인덱스)를 add해준다.
            s.add(i);
        }

        bw.flush();

    }

}



제출 화면

백준 문제 맞았습니다


오늘 문제는 스택을 생각하지 못한다면 굉장히 풀기 힘든 문제이다.


사실 바로 전에 올렸던 문제와 굉장히 흡사한 문제였기에 이 블로그를 봤던 사람이라면 쉽게 풀었을 것이다.

이 블로그를 보는 사람이 거의 없다는 점이 문제긴 하지만...

2021년 7월 30일 금요일 - 건강 검진 처음 해봄!


오늘 올려볼 문제는 17298번 오큰수 라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

백준 문제 사진

오늘은 건컴 후배님이 푸신 문제들을 둘러보다가 찾은 문제를 가지고 왔다!

형님 보고 계시나요??


입력 예제

백준 입력 예제


입력은 매우 단순한 문제이다.




풀이 및 코드


이 문제는 스택을 사용하는 것이 가장 중요한 포인트이다.


풀이를 간단히 설명해보자면


  1. 스택에는 배열의 인덱스를 저장한다.
  2. 스택이 비어있지 않을 경우에는 아래의 과정을 진행한다.
    • 스택의 들어있는 인덱스에 해당하는 값보다 현재 인덱스의 해당하는 값이 클 경우 스택에서 인덱스를 pop하고 pop한 인덱스 부분에 현재 인덱스의 해당하는 값을 저장한다.
    • 스택의 들어있는 인덱스에 해당하는 값보다 현재 인덱스의 해당하는 값이 크지 않을 경우 이 과정을 벗어난다.
    • 또한 스택이 비어있는 경우에도 이 과정을 벗어난다.
  3. 스택이 비어있을 경우에는 그냥 해당하는 인덱스를 저장한다.
  4. 위 과정이 모두 끝나면 스택이 비워지지 않을 때까지 스택에 있는 인덱스를 꺼내서 인덱스 부분에 -1을 저장한다.

위에서 설명을 간단히 하느라 조금 헷갈리는 부분이 있을 수도 있을 것 같다... (특히 해당하는 인덱스와 저장하는 부분의 괴리)


그러니 코드를 봐보자!


풀이코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // n 입력 받음
        int n = Integer.parseInt(br.readLine());

        // 배열 입력 받음
        String[] input_arr = br.readLine().split(" ");

        // 최종적으로 출력할 숫자들을 저장하는 배열 (위에서 설명한 저장하는 곳이 이 배열이다.)
        int[] result = new int[n];

        // 스택
        Stack<Integer> s = new Stack<Integer>();

        for(int i = 0; i < n; i++)
        {
            while(true)
            {
                // 스택이 비워져 있다면 break;
                if(s.isEmpty())
                    break;

                // 스택에 들어있는 인덱스를 입력받은 배열에 접근하여 값을 가져옴, 그 값이 현재 for문 i에 해당하는 값보다 작으면
                if(Integer.parseInt(input_arr[s.peek()]) < Integer.parseInt(input_arr[i]))
                {
                    // result배열에 스택에 들어있던 인덱스를 pop하고 그 인덱스에 현재 for문 i에 해당하는 값을 저장한다.
                    result[s.pop()] = Integer.parseInt(input_arr[i]);
                }
                // 아니라면 break;
                else
                {
                    break;
                }
            }

            // 위 과정과 상관없이 현재 인덱스는 스택에 항상 추가해준다.
            s.add(i);
        }

        // 스택에 값이 남아있다면
        while(!s.isEmpty())
        {
            // 스택에 들어있던 인덱스를 pop하고 그 인덱스에 -1을 저장한다.
            result[s.pop()] = -1;
        }

        // result 배열을 출력한다.
        for(int i = 0; i < n; i++)
        {
            bw.write(result[i] + " ");
        }

        bw.flush();

    }

}



제출 화면

백준 문제 맞았습니다


오늘 문제는 스택을 생각하지 못한다면 굉장히 풀기 힘든 문제이다.

2중 for문을 사용하면 시간복잡도가 O(n^2)이 되어버리기 때문에 최대 입력이 1,000,000인 이 문제에서는 시간초과가 분명히 날 것이다.


이런 문제들을 볼 때마다 자료구조 공부가 얼마나 중요한지 깨닫게 되는거 같다.

2021년 7월 26일 월요일 - 여전히 덥구나


오늘 올려볼 문제는 1043번 거짓말 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

백준 문제 사진

오늘은 문제를 둘러보다 문제가 꽤 재밌어보여서 가지고왔다.

근데 어렵다..


입력 예제

백준 입력 예제
백준 입력 예제


백준 문제 중에서 입력 예제가 매우 많은 편인 문제다!


입력 예제를 간략히 설명하자면


  1. 첫째줄에는 n(파티에 참가하는 인원)과 m(파티의 개수)가 주어진다.
  2. 둘째줄에는 진실을 아는 사람의 명수가 주어지고 그 명수만큼 같은 줄에 띄어쓰기로 구분되어 사람들의 번호가 주어진다.
  3. 셋째줄부터 m + 3줄까지는 파티에 참여하는 사람의 명수가 주어지고 그 명수만큼 같은 줄에 띄어쓰기로 구분되어 사람들의 번호가 주어진다.



풀이 및 코드


사이트에 들어가서 해당 문제의 분류를 보면 알겠지만 그래프 기법을 사용해서 문제를 푸는 것이 정석이다.


하지만 난! 오늘은 매우 비효율적이지만 그래프를 사용하지 않는 방법으로 문제를 풀 것이다!
알고리즘적으로는 별로 도움이 안된다는 말...


먼저 풀이를 설명하기 전에 문제를 한 번 봐보자.


  1. 지민이의 진실을 알고 있는 사람이 파티에 참여할 경우 지민이는 진실을 말한다.
  2. 파티에 참가하는 사람 중 저번 파티에서는 진실을 듣고 이번 파티에서는 거짓말을 듣는 상황이 생겨서는 안된다.
  3. 이 때 지민이가 거짓말을 할 수 있는 파티의 최대 개수를 구하는 것이 이 문제이다.

문제만 보면 직감에 의한 오류를 범하기 쉽다.


바로 이전 파티에서 거짓을 듣고 이번 파티에서 진실을 듣는 경우에 대해서는 생각하기 쉽지 않기 때문이다.

이전 파티에 대해서는 그저 이전 파티로만 생각하고 처리하게 되면 이러한 오류를 저지르게 된다.


그러면 이 때 막막하기 시작할 것이다.

그럼 대체 어떤 방법을 사용해야 하는 것인가... 아까 말한 그래프를 사용하는 방법이 가장 좋은 방법이 아닌가?


물론 그래프를 사용하는 것이 공부도 되고 좋긴 하겠지만... 구현이 너무 귀찮다....


그렇기에 나는 그냥 무식하게 여러번 비교하는 방법을 사용하기로 했다!!


코드와 같이 설명하겠다!


풀이코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 진실을 알고 있는 사람들을 저장하는 배열(알고 있으면 true 아니면 false)
        boolean[] know_truth = new boolean[55];

        String[] input_nums = br.readLine().split(" ");

        int n = Integer.parseInt(input_nums[0]), m = Integer.parseInt(input_nums[1]);

        // 입력을 저장하는 배열(여러번 비교할 것이기 때문에 저장 필수)
        String[] arr = new String[m];

        // 입력으로 주어지는 진실을 알고 있는 사람
        String[] truth_nums = br.readLine().split(" ");

        // know_truth배열에서 true로 만들어주기
        for(int i = 1; i < truth_nums.length; i++)
        {
            know_truth[Integer.parseInt(truth_nums[i])] = true;
        }

        // 입력을 받고 진실을 알고 있는 사람과 같은 파티에 참가한 사람도 진실을 아는 것으로 바꾸는 과정
        for(int i = 0; i < m; i++)
        {
            arr[i] = br.readLine();
            String[] input = arr[i].split(" ");
            boolean flag = false;

            for(int j = 1; j < input.length; j++)
            {
                if(know_truth[Integer.parseInt(input[j])])
                {
                    flag = true;
                    break;
                }
            }

            if(flag)
            {
                for(int j = 1; j < input.length; j++)
                {
                    know_truth[Integer.parseInt(input[j])] = true;
                }
            }

        }

        // 위 과정에서 입력을 받는 것만 빼고 같은 과정을 50번 반복한다. (파티의 수가 최대 50개가 될 수 있기 때문)
        for(int a = 0; a < 50; a++)
        {
            for(int i = 0; i < m; i++)
            {
                String[] input = arr[i].split(" ");
                boolean flag = false;

                for(int j = 1; j < input.length; j++)
                {
                    if(know_truth[Integer.parseInt(input[j])])
                    {
                        flag = true;
                        break;
                    }
                }

                if(flag)
                {
                    for(int j = 1; j < input.length; j++)
                    {
                        know_truth[Integer.parseInt(input[j])] = true;
                    }
                }

            }
        }

        int result = 0;

        // 진실을 아는 사람은 모두 구해졌으므로 파티에서 진실을 아는 사람이 없을 때만 result를 증가시킨다.
        for(int i = 0; i < m; i++)
        {
            String[] input = arr[i].split(" ");
            boolean flag = true;

            for(int j = 1; j < input.length; j++)
            {
                if(know_truth[Integer.parseInt(input[j])])
                {
                    flag = false;
                    break;
                }
            }

            if(flag)
            {
                result++;
            }
        }

        bw.write(result + "\n");
        bw.flush();

    }

}



제출 화면

백준 문제 맞았습니다


사실 내가 푼 방식은 시간복잡도 O(n^3)으로 만약 입력 개수가 500 이상이 된다고 하면 이 방법을 쓰기에는 어려움이 많을 것이다.


하지만 오늘 이 포스팅을 쓴 이유는 문제 해결을 위해서 정석적인 길말고도 다른 길도 있다는 것을 알려주기 위해서 포스팅을 한 것이다.


알고리즘 문제뿐만이 아닌 현실의 문제에서도 다른 길이 있을 수 있으니 정석이 너무 힘들다면 조금 다른 방법도 생각해보는 것도 나쁘지 않을 것 같다.

동기들과 프로젝트를 진행하자고 말한지 벌써 6일이 지나고 있다..

 

이럴 때 보면 시간 참 빨라..

 

여하튼 이번에 웹 크롤링을 해야하기 때문에 크롤링에 대해서 검색 또 검색을 했다...

 

앱을 만들거기에 자바로 크롤링을 해보려 했지만 동적 데이터 크롤링은 힘들것 같아서 파이썬으로 갈아타는 방법으로 구현할려고 파이썬 셀레니움을 사용하여 기초적 크롤러를 만들어봤다.

사실 크롤러라고 하기에도 애매한 수준의 크롤러

 

그렇게 자바에서 파이썬을 어떻게 돌려야하나 생각하면서 구글링을 하는데 이게 웬걸? 셀레니움이 자바용으로도 있었던 것이었다!!

파이썬에 쓴 내 시간은... 그래도 그 코드 자바에 쓰긴 썼으니깐...

 

발견하자마자 자바를 키고 셀레니움을 다운받은 후 파이썬으로 짠 코드와 똑같이 코드를 짜서 실행해보니!

 

 

 

에러가...

 

 

 

또 이 에러 고칠려고 구글링...

 

유명한 에러인지 스택오버플로에서 어렵지 않게 찾을 수 있었다.

 

이해 안되는 영어속에서 이해 되는 단어만 가지고 유추해가며 에러를 고쳐나갔다...

 

그렇게 에러를 힘들게 고치고!!!! 잘 작동되는 것을 보니 이제야 좀 쉴 수 있을 것 같다.

 

 

물론 지금 내가 짠 코드는 안드로이드 스튜디오에서는 안돌아갈 것이기 때문에 안드로이드 스튜디오로 옮기는 과정을 또 구글링 할 걸 생각하니... 아득해진다... ㅎㅎ

 

앞으로 회의까지 이틀이 남았는데 팀원들이 자료를 잘 찾아와주길 바란다 ㅎㅎ

 

한 번 멋진 앱을 만들어보쟈!!

 

 

 

2021년 7월 24일 토요일 - 매미가 운다 맴맴


오늘 올려볼 문제는 1987번 알파벳 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

백준 문제 사진

오늘은 저번에 풀었던 문제와 비슷한 문제를 가지고 왔다!

사실 거의 똑같다


입력 예제

백준 입력 예제


입력 예제를 보면 문제가 무슨 말인지 이해하기 쉬울 것이다!




풀이 및 코드


문제를 요약하자면 한 번 밟았던 알파벳은 밟지 않고 상하좌우로 움직일 때 가장 많이 갈 수 있는 칸의 개수를 구하는 것이다.


그렇다면 생각해야 할 부분은 좌표의 방문 여부가 아닌 알파벳의 방문 여부가 된다.


각 알파벳은 char형으로 볼 수 있고, char형은 int형으로 볼 수 있으므로 알파벳을 숫자로 생각해서 문제를 풀어보자!


풀이코드


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

    // 알파벳을 숫자로 사용할 것이기 때문에 방문 여부를 확인 하는 배열을 선언했다. (알파벳으로(숫자로) 편하게 배열 접근 가능!)
    static boolean[] visit;
    // 알파벳을 숫자로 바꾸어 저장할 2차원 배열이다.
    static int[][] arr;

    // 입력받은 판의 크기를 저장할 변수와 결과 변수
    static int r, c, result = 0;

    // 상하좌우를 나타내는 배열이다.
    static int[] ra = {0, 1, 0, -1};
    static int[] ca = {1, 0, -1, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] input_nums = br.readLine().split(" ");

        r = Integer.parseInt(input_nums[0]);
        c = Integer.parseInt(input_nums[1]);

        arr = new int[r][c];

        visit = new boolean[30];

        for(int i = 0; i < r; i++)
        {
            String input = br.readLine();

            for(int j = 0; j < c; j++)
            {
                arr[i][j] = (int)(input.charAt(j) - 'A');
            }
        }

        solve(0, 0, 1);

        bw.write(result + "\n");
        bw.flush();
    }

    // 해당 좌표와 지나간 칸의 개수를 파라매터로 받는 함수
    public static void solve(int x, int y, int length)
    {
        // 지나간 칸의 개수가 결과값보다 크면 결과값은 지나간 칸의 개수로 바꾼다.
        if(result < length)
            result = length;

        // 해당 좌표에 해당하는 알파벳(숫자)을 방문한 것으로 만든다.
        visit[arr[y][x]] = true;

        // 상하좌우 좌표에 대해서 방문하지 않은 알파벳이고 판의 크기보다 크거나 작지 않다면
        for(int i = 0; i < 4; i++)
        {
            if(x + ca[i] < c && x + ca[i] >= 0 && y + ra[i] < r && y + ra[i] >= 0)
            {
                if(!visit[arr[y + ra[i]][x + ca[i]]])
                {
                    // 재귀를 진행한다.
                    solve(x + ca[i], y + ra[i], length + 1);
                }
            }
        }

        visit[arr[y][x]] = false;
    }

}



제출 화면

백준 문제 맞았습니다


알파벳을 숫자로 바꾸어서 생각한다면 저번에 풀었던 1103번 게임 과 매우 유사한 문제였다.


오늘도 이 포스팅이 누군가에게 도움이 되길바란다.

2021년 7월 20일 화요일

 

내 동기들과 함게 프로젝트를 진행해보기로 했다.

 

안드로이드 스튜디오를 사용해서 앱을 만들어 볼 것인데 

 

주제는 대충 정해졌고 아직 구체적인 것에 대해서는 정해진 바가 없다.

 

다음 회의는 7월 28일 수요일 저녁 7시로 했고, 각자 정해진 주제와 관련한 모든 것을 찾아오는 것으로 했다.

 

개강을 하기 전까지 앱을 완성해서 배포해보는 것이 목표다.

 

열심히 해보자!

2021년 7월 21일 수요일 - 오늘은 이렇게 더워도 되나 싶다;


오늘 올려볼 문제는 2578번 빙고 라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

백준 문제 사진
백준 문제 사진

오늘은 딱 보기에도 쉬워보이는 문제를 가져왔다!
이번에는 진짜로 쉽다는 거


입력 예제

백준 입력 예제


배열의 크기도 25이고 들어오는 입력의 최대 개수도 25개이므로 그저 선형적으로 문제를 풀어도 아마 잘 풀릴 것이다.


하지만 나는 욕심을 좀 더 내서 더 빠르게 문제를 풀어볼 예정이다!
하지만 입력 케이스가 크지 않아서 큰 차이는 없을 것이다...




풀이 및 코드

그래서 생각해낸 기법은 boolean 배열을 사용하는 방법이다!


백문이 불여일견이라고 바로 코드를 봐보자!


풀이코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 해당 숫자를 사회자가 불렀는지 확인하는 boolean 배열
        boolean[] check = new boolean[26];
        // 빙고판으로 사용되는 int 배열
        int[][] bingo = new int[5][5];
        // 결과값 저장하는 변수
        int result = 0;

        // 빙고판에 숫자 넣기
        for(int i = 0; i < 5; i++)
        {
            String[] input = br.readLine().split(" ");

            for(int j = 0; j < 5; j++)
            {
                bingo[i][j] = Integer.parseInt(input[j]);
            }
        }

        Loop:
        for(int i = 0; i < 5; i++)
        {
            String[] input = br.readLine().split(" ");

            for(int j = 0; j < 5; j++)
            {
                // 선이 그어진 개수를 세는 변수
                int lines = 0;

                // 사회자가 부른 숫자를 true로 바꾸어준다.
                check[Integer.parseInt(input[j])] = true;

                // 결과값 + 1
                result++;

                // 가로줄, 세로줄 확인하는 과정
                for(int a = 0; a < 5; a++)
                {
                    if(check[bingo[a][0]] && check[bingo[a][1]] && check[bingo[a][2]] && check[bingo[a][3]] && check[bingo[a][4]])
                        lines++;
                    if(check[bingo[0][a]] && check[bingo[1][a]] && check[bingo[2][a]] && check[bingo[3][a]] && check[bingo[4][a]])
                        lines++;
                }

                // 대각선 2줄 확인하는 과정
                if(check[bingo[0][0]] && check[bingo[1][1]] && check[bingo[2][2]] && check[bingo[3][3]] && check[bingo[4][4]])
                    lines++;
                if(check[bingo[0][4]] && check[bingo[1][3]] && check[bingo[2][2]] && check[bingo[3][1]] && check[bingo[4][0]])
                    lines++;

                // 선이 그어진 줄 수가 3이 넘어가면 반복문 벗어나기
                if(lines >= 3)
                    break Loop;
            }
        }

        bw.write(result + "\n");
        bw.flush();
    }

}



제출 화면

백준 문제 맞았습니다


boolean 배열을 빙고판과 똑같이 2차원 배열로 만드는 것이 아닌 숫자가 불렸는지 판단하는 용도로만 사용하면 선형적으로 접근하지 않고 문제를 풀 수 있다!


오늘은 굉장히 쉬운 문제였지만 시간적으로 좀 더 우세한 방법으로 풀어봤다!

물론 이 방법도 입력 개수가 커지게 되면 사용하기 힘들지만 적당한 입력 개수에서는 사용해볼만한 기법이다!

+ Recent posts