자료구조와 알고리듬 With Java/[Study] BAEKJOON 프로그래머스 CodeUp LeetCode

2022-08-28 [11회차] 알고리즘 스터디

계란💕 2022. 8. 28. 23:55

1. 팔 - 실버1

08-28 일

출처 https://www.acmicpc.net/problem/1105

 

1105번: 팔

첫째 줄에 L과 R이 주어진다. L은 2,000,000,000보다 작거나 같은 자연수이고, R은 L보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

 

  MySol) ======= 미해결 코드 ========

java
열기

    - 완전 탐색을 이용했더니 비효율적이라서 백준 통과하지 못했다.

    - if문 안에서 findEight(s) 와 minCnt를 비교하는 것보다 if문 앞에 int n =  findEight(s)을 선언한 다음 n과 minCnt를 비교하는 것이 더 좋다.

    - 그리고 minCnt의 초깃값은 MAX_INTEGER 값으로 줘야 디버그를 돌렸을 때 값이 변하는 것을 볼 수 있다.

 

 

   Sol) Gw

  스터디원 블로그  https://guiwoo.tistory.com/

class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] inputs= bf.readLine().split(" ");
        String Left = inputs[0];
        String Right = inputs[1];
        // Left<= Right;
        // 자리수가 달라 ? 그냥 뱉어
        if(Left.length() < Right.length()){
            System.out.println(0);
            return;
        }
        //두개가 같어 ? 그냥 뱉어
        if(Left.equals(Right)){
            int cnt = 0;
            for (int i = 0; i < Left.length(); i++) {
                if(Left.charAt(i) == '8') cnt++;
            }
            System.out.println(cnt);
            return;
        }
        //같은자릿수 에 Left right 앞자리부터 비교
        int idx = 0;
        int countEight = 0;
        while(idx < Left.length()){
            if(Left.charAt(idx) == Right.charAt(idx)){
                if (Left.charAt(idx) == '8') {
                    countEight++;
                }
                idx++;
            }else{
                break;
            }
        }
        System.out.println(countEight);
        return;
    }
}

    - 주어진 두 수의 자릿수가 다르면 두 수 사이에 어떤 10의 제곱수가 존재하므로 0을 반환한다.

      -> 10의 제곱수는 8이 하나도 없으니까 다음은 볼 필요도 없다.

    - 따라서 두 수의 자릿수가 같은 경우만 탐색한다.

 

 

  Sol) IA 

스터디원 블로그 -  https://velog.io/@kormeian       

java
열기

    - 초간단 코드..

    - 마찬가지로 두 개의 자릿수가 같은 경우에만 탐색한다.

    - L, R을 맨 앞에서 부터 같은 자릿수에 있는 숫자를 각각 비교하며 둘다 8이 있는 경우, 둘의 중간 값들도 그 자릿수는 8이 하나 들어가야하므로 플러스 해준다.

 

 

 

2. Number of Islands - medium (DFS, BFS )

08-29 월 

출처 https://leetcode.com/problems/number-of-islands/

 

Number of Islands - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

  MySol)

java
열기

    - static int를 이용했는데 위의 3가지 테스트 케이스를 돌리면 1, 4, 1이 나왔다.

       -> static을 이용하면 객체 생성없이 바로 사용 가능한데 1번 테스트에서의 결괏값인 1에 더해서 누적되기 때문에 정답 3이 아닌 4가 나온 것이다. 

      -> 따라서, 메서드 맨 위에 0으로 초기화 해주는 작업이 꼭 필요하다.

 

  Sol)  Gyu

java
열기

    - 최단거리 문제가 아니라서 당연히 DFS라고 생각했는데 이 문제는 BFS로도 구현이 가능하다는 걸 알았다.

    - 내가 푼것과 마찬가지로 if문 안에서 BFS가 끝날 때마다  result에 1을 더해주도록 한다.

    - Deque, while문 사용한 것 빼고는 내 코드와 거의 비슷하다.

 

 

 

3. 스택 수열 - 실버 2

  

08-30 화

출처 https://www.acmicpc.net/problem/1874

 

1874번: 스택 수열

1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다.

www.acmicpc.net

 

  MySol) 2200ms  =(StringBuffer)=> 1030ms =(Scanner 대신 BufferedReader 이용)=> 380ms

java
열기

    - 줄바꿈을  포함해서 출력해야해서 그런지 Scanner를 이용하는 경우와 BufferedReader를 이용하는 경우의 속도 차이가 많이 난다.

    - 그리고 결괏값을 출력하기 위해 ArrayList 보다는 StringBuffer 또는 StringBuilder를 이용하는게 훨씬 효율적이다.

 

  sol) Gyu - 330ms

java
열기

    - StringBuffer을 써서 그런지 시간이 훨씬 짧고 효율적이다.

    - Stack이 아닌 Deque를 이용했다는 부분 말고는 나와 로직이 거의 비슷하다.

 

 sol)  Ia

 스터디원 블로그 - https://velog.io/@kormeian

java
열기

 

 

 

4. 두 Queue의 합 같게 하기

 

08-31 수

 출처 - https://school.programmers.co.kr/learn/courses/30/lessons/118667

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  MySol) 53점 - 시간 초과 해결하기

java
열기