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

2022-06-29 [5회차] 알고리즘 스터디

계란💕 2022. 7. 6. 18:56

 

1. 색종이 만들기 - 실버 2

출처:  백준 2630번 https://www.acmicpc.net/problem/2630

 

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net

 

  MySol)

    - while문으로 작성하려 해서 결국 못 풀었다.

    - 재귀함수, 백트래킹을 이용해서 풀어야한다.

 

  Sol) 스터디원 코드

     - 종이를 자를지 말지 결정한다.

    - 재귀함수 인덱스 두 가지를 넘긴다.

 

    - 두 번째 방법: cut2()

      -> gap은 간격의 길이 

      -> boolean cutFlag: 잘라야 하는지 판단한다.

java
열기

 

  Note) 입출력 예시

java
열기

 

 

 

2.  순간 이동 - 프로그래머스

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

 

프로그래머스

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

programmers.co.kr

 

  Sol) 스터디원 코드 -  0.0xx ms 

java
열기

    - n -> 0으로 가는 방법을 생각한다.

      -> 처음 문제를 풀면서 이 생각을 잠깐 하기는 했는데 왠지(?) 아닐 것 같다는 느낌에 시도하지 않았다.

      -> 그런데 이렇게 간단하게 풀리는 걸 보니까 스치는 아이디어라도 도전해봐야겠다는 생각이 들었다.

    - n이 짝수인 경우는 2로 나누고 홀수인 경우는 n = n - 1해서 n = 0이 된 경우의 answer를 반환하도록한다.

    - 그런데, 한 줄 짜리 코드가 있다는 건 정말 놀라웠다.

     -> Integer클래스의 bitCount() 메서드(이진수로 나타냈을 때 1의 개수)를 이용하면 정답을 바로 반환할 수 있다. 

    - 이 문제와 다르게 뒤로도 갈 수 있는 경우가 포함된 문제는 그리디로 푼다.

 

 

3.  스도쿠 -  Amazon 기출

출처:  https://leetcode.com/problems/sudoku-solver/

 

Sudoku Solver - 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

  Sol) 스터디원 코드

java
열기

  - 한 칸씩 DFS를 돌린다.

  - 전에 백준에서 스도쿠를 가져왔던 분께서 유형이 조금 다른 문제를 가져왔다.

  - 코드가 길기는 하지만 복습을 제대로 해야겠다.

 

 

4. 222폴링 - 실버 2

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

 

17829번: 222-풀링

조기 졸업을 꿈꾸는 종욱이는 요즘 핫한 딥러닝을 공부하던 중, 이미지 처리에 흔히 쓰이는 합성곱 신경망(Convolutional Neural Network, CNN)의 풀링 연산에 영감을 받아 자신만의 풀링을 만들고 이를 22

www.acmicpc.net

 

 Sol) 스터디원 코드 - 900ms

java
열기

    - 우선순위 큐를 이용하면 두번째로 큰 수를 뽑는게 수월해진다. 메서드 getNum()

      -> 우선순위 큐로 내림차순 정렬하여 두 번 poll()하면 두 번째로 큰 값이 나온다. 

    - while문을 실행할 때 새로운 1차원 배열 선언, smallMat[] 를 2차원 배열이 아닌 1차원 배열로 둔다.

      -> board가 8 * 8행렬이면 네 칸 짜리 서브 배열이 64 / 4 = 16개 만들어진다. (while문 마지막에 board의 크기를 바꿔서 다시 선언하고 smallMat값을 각각 대입)

      -> 그러면 16개의 구역에 대한 두 번째 작은 값을 각각 뽑아서  smallMat[idx++] = getNum(i, j) 에 저장한다.

      -> 2차원 배열의 각 구역에서 두번째 작은 값을 => 1차원 배열에 각각 저장하고  => 2차원 배열에 다시 저장

      -> 이 부분이 참신하다고 느꼈다. 비슷한 유형이 나오면 꼭 활용해야겠다.

    - for(int i = 0;i < smallMat; ++i){} :

      -> i  / (size / 2) => 새로운 배열의 row,  

      -> i  % (size / 2) => 새로운 배열의 col, 

      -> board[row][col] = smallMat[i];가 된다. 

    - for문에 i나 j가 단항 연산자로 쓰이지 않고 +2 할 수도 있다. (당연한 부분인데 코드가 낯설었다.)

 

  MySol)  스터디원 코드 수정

java
열기

  Note) 입출력 예시

java
열기

 

 

5. H-index

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

 

프로그래머스

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

programmers.co.kr

 

  Sol 1) 내가 가져간 문제

java
열기

    - 문제의 입출력 예시가 하나 밖에 없고 문제 설명이 모호해서 푸는데 좀 오래 걸렸다.

    - 반환해야 하는 부분이 arr[i]보다 큰 배열의 원소의 개수보다 arr[i] 크거나 같은 부분의 개수이다.

      -> 정렬해서 length - i를 하면 arr[i]보다 크거나 같은 원소들의 개수가 나온다.

    - 뒤에서부터 카운트하는 방법으로 다시 작성하면 그게 더 쉬울 것 같다. (아래에 코드를 짰는데 테스트 하나가 오답이다.)

    - 전에 공부했던 문제지만 확실히 이해하지 못해서 공부하려고 가져간 문제이다.

    - 내가 가져가서 스터디원 분들한테 설명했는데 다들 어렵다고 하셨다. 다음부터는 그림을 미리 그려가거나 준비해서 다같이 이해할 수 있도록 스터디 준비를 해야겠다.

 

 

  Sol 2)

java
열기

  - 이렇게 하면 테스트 케이스 하나를 통과하지 못한다.

    - 처음에 위 사진처럼 통과하지 못했는데 solution 반환이 for문 안에서 끝날 수 있도록, i = 0일 때 H를 반환하도록 if문을 짜니까 통과했다.

    - 다른 블로그를 보면서 테스트 케이스를 추가해보니까 for문에서 가능한 i 끝까지 돌고났을 때의 경우를 생각하지 못하고  0을 반환하도록 짠 것이 화근이었다.

    - 엣지 케이스를 모두 고려해서 작성해야겠다.

    - 참고로 메서드의 맨 마지막 부분인 return 0까지는 실행되지 않는다.