Skip to content

rustiebeats/problem-solving-teatime

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 

Repository files navigation

PS 향유회

PS/KakaoTalk_Image_2019-12-09-09-30-29_002.jpeg

매일 알고리즘을 풀어보는 단톡방 :)

채팅방 링크

https://open.kakao.com/o/g3antjMb

그룹 링크

https://www.acmicpc.net/group/12543

노션 링크 (Deprecated)

[https://www.notion.so/PS-da8977089c2344dba9bdbc3d0188d286]

월간 향유회

https://www.acmicpc.net/category/850 문의 환영

규칙

  • 하루에 한문제씩 향유합니다.
  • 무슨 문제를 향유할지는 의견이 없으면 제가 제시합니다.
  • 의견 제안은 제가 아침에 새로운 향유문제를 올리기 전까지입니다.
  • 어려운 문제가 나왔을 때는, 4시부터 서로 힌트를 주고받습니다.
  • 밤 8시 부터 푼 문제의 코드를 공개합니다.

항유회를 즐기는 방법

  • 문제를 푸는 그 자체를 재밌게 즐기기.
  • 점심 시간에 중상급 한 문제를 풀기
  • 점심 시간에 중하급 두 문제를 풀기
  • 특이한 언어로 중하급 두 문제를 풀기
  • 주중에 나온 문제를 주말에 몰아 풀고 올리기

Resources

서적

사이트

CS 강의

https://github.com/prakhar1989/awesome-courses#algorithms

플랫폼

블로그

알고리즘 대회 캘린더

엣코더, 코드포스 등 대회를 자주 확인할 수 있습니다. 구글 캘린더로 등록하면 유용합니다.

해커랭크 캘린더 : https://www.hackerrank.com/calendar

알고리즘 대회 캘린더 : https://competitiveprogramming.info/calendar

향유문제

2020년 9월 4일

2020년 9월 3일

2020년 9월 1일

2020년 8월 28일

2020년 8월 24일

2020년 8월 21일

2020년 8월 19일

2020년 8월 18일

2020년 8월 13일

2020년 8월 12일

2020년 8월 11일

2020년 8월 10일

2020년 8월 7일

2020년 8월 6일

2020년 8월 5일

2020년 8월 4일

2020년 8월 3일

2020년 7월 31일

2020년 7월 30일

2020년 7월 29일

2020년 7월 28일

2020년 7월 27일

2020년 7월 23일

2020년 7월 22일

2020년 7월 21일

2020년 7월 20일

2020년 7월 17일

2020년 7월 16일

2020년 7월 15일

2020년 7월 14일

  • 중하급
  • 중상급
    • 백준, 네온사인
    • https://www.acmicpc.net/problem/8907
      • http://boj.kr/14935fa75c1c402ab41da943233567aa
      • 단색 삼각형의 수는, 전체 삼각형의 수에서 단색이 아닌 삼각형의 수를 빼는 것입니다.
      • 전체 삼각형의 수는 nC3입니다.
      • 단색이 아닌 삼각형은 (파, 빨, 빨) (빨, 파, 파) 로만 이루어져 있습니다.
      • 한 꼭지점을 기준으로 빨간 것 한개, 파란 것 한개를 골랐을 경우, 이것은 반드시 단색이 아닙니다.
      • 각각 꼭지점을 순회하며 그 꼭지점을 지나가는 튜브의 빨간색 수, 파란색 수를 세서 (빨간색 수)*(파란색 수) 를 하면 단색이 아닌 삼각형의 두 배가 됩니다.
      • 구한 값을 전체 삼각형에서 빼면 단색 삼각형 수가 됩니다.

2020년 7월 13일

  • 중하급
  • 중상급
    • 팰린드롬 보행
      • https://www.acmicpc.net/problem/12950
      • 0번 점과 1번 점에서 순회를 시작합니다. (0, 1) 을 우선순위 큐에 넣습니다.
      • (시작점, 끝점) 쌍을 큐에 넣는다는 생각을 합니다.
      • 0번과 연결되어 있는 i번 정점, 1번과 연결되어 있는 j번 정점에 대하여, 0-i와 1-j가 같은 알파벳이면, 이것은 팰린드롬 경로의 후보가 됩니다. 그 후보군의 길이는 1 * 2입니다.
      • 따라서 (i, j)를 큐에 넣고, 1을 저장합니다.
      • 이런 방식으로 다익스트라 알고리즘을 다 돌리고 후보군의 길이를 저장합니다.
      • (i,i) 가 길이가 존재하면, 0번 - i번 - 1 번으로 가는 팰린드롬 경로가 존재하는 것이고, 그 길이는 저장된 것의 2배입니다.
      • (i,j) 의 길이가 존재하고, (i, j) 가 연결되어 있으면, 0번 - i번 - j번 - 1번으로 가는 팰린드롬 경로가 존재하는 것이고, 그 길이는 저장된 것의 2배에 1을 더한 것입니다.
      • 최소값을 출력합니다.

구글 킥스타트 2020 Round D

풀이들

2020년 7월 10일

2020년 7월 9일

2020년 7월 8일

2020년 7월 7일

https://tech.kakao.com/2020/07/01/2020-internship-test/

카카오 인턴십 2020 풀이

2020년 7월 6일

2020년 7월 3일

2020년 7월 2일

2020년 7월 1일

2020년 6월 30일

2020년 6월 29일

2020년 6월 26일

2020년 6월 25일

2020년 6월 23일

2020년 6월 22일

2020년 6월 19일

2020년 6월 17일

2020년 6월 16일

2020년 6월 15일

2020년 6월 11일

2020년 6월 10일

2020년 6월 8일

2020년 6월 6일

2020년 6월 4일

2020년 6월 3일

2020년 6월 1일

2020년 5월 29일

2020년 5월 28일

2020년 5월 26일

2020년 5월 25일

2020년 5월 21일

2020년 5월 19일

2020년 5월 16일

2020년 5월 15일

2020년 5월 14일

2020년 5월 13일

2020년 5월 11일

2020년 5월 8일

2020년 5월 7일

2020년 5월 6일

2020년 5월 5일

2020년 5월 4일

2020년 4월 28일

2020년 4월 27일

2020년 4월 24일

2020년 4월 23일

2020년 4월 22일

2020년 4월 19일

2020년 4월 18일

2020년 4월 17일

2020년 4월 16일

2020년 4월 15일

2020년 4월 13일

2020년 4월 10일

2020년 4월 8일

2020년 4월 7일

2020년 4월 6일

  • 중하급
  • 중상급
    • https://leetcode.com/problems/stamping-the-sequence/
    • 그리디
      • 타겟이 ababc, 스탬프가 abc 인 경우, abc 인 패턴을 찾아서 물음표로 대체한다. ab???
      • 이제 a??, ab?, ?b?, ??c 등 [0개 이상의 물음표][일치하는 문자열][0개 이상의 물음표] 인 패턴을 찾아서 일치하는 문자열을 물음표로 대체한다.
      • 전부 물음표가 될 때까지 방법을 반복하고, 찍었던 위치의 인덱스를 뒤집어서 반환한다.

2020년 4월 4일, 5일

코드잼 예선으로 스킵 :)

코드잼 2020년 예선 : https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27

3번

https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/000000000020bdf9

4번

https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/0000000000209a9e

5번

https://codingcompetitions.withgoogle.com/codejam/round/000000000019fd27/0000000000209aa0

2020년 4월 2일

2020년 4월 1일

2020년 3월 30일

2020년 3월 26일

2020년 3월 25일

2020년 3월 24일

2020년 3월 23일

2020년 3월 22일

2020년 3월 20일

2020년 3월 19일

2020년 3월 18일

2020년 3월 17일

2020년 3월 16일

2020년 3월 15일

2020년 3월 13일

2020년 3월 12일

2020년 3월 11일

2020년 3월 10일

2020년 3월 9일

  • 중하급
  • 중상급
    • 백준, N의 배수 (1), 동적 프로그래밍
      • https://www.acmicpc.net/problem/18790
        • 풀이
        • http://boj.kr/53e751498d6c41f9b52709d4fae07335
        • dp(range, picking_number, sum_of_mod) : 0..<range 에서 picking_number 개 뽑았을 때 합이 sum_of_mod 인 해가 있는지 여부 (bool)
        • dp(range, picking_number, sum_of_mod) 에 range 번째 원소가 포함된 경우, dp(range-1, picking_number-1, sum_of_mod) 와 가능성이 동치이다.
        • 반면 range 번째 원소가 포함되지 않을 경우, range-1 범위에서 picking_number개 만큼 고르고, 그 합이 sum_of_mod - (range 번째 원소의 값) 과 가능성이 동치이다.
        • n*3 만큼 순회하고 각각 가능성마다 range 번째 원소의 포함 / 불포함 여부를 기억해 낸 후 백트래킹한다.

2020년 3월 7일

2020년 3월 6일

2020년 3월 5일

2020년 3월 4일

2020년 3월 3일

2020년 3월 2일

2020년 3월 1일

  • 중하급

    • 프로그래머스, 쇠막대기

      #include <iostream>
      #include <queue>
      #include <vector>
      #include <stack>
      using namespace std;
      
      int solution(string arrangement) {
      
          int answer = 0;
          stack<char> st;
          for (auto i=0; i< arrangement.length(); i++){
              if (arrangement[i]=='(') st.push(arrangement[i]);
              else {
                  st.pop();
                  if (arrangement[i-1]=='('){
                      answer += st.size();
                  }else {
                      answer++;
                  }
              }
          }
          return answer;
      }
  • 중상급

2020년 2월 29일

2020년 2월 28일

  • 중하급
  • 중상급
    • 백준, 리그 오브 레전설 (Large)
    • 백준, 경찰차
      • https://www.acmicpc.net/problem/2618
      • 풀이
        • http://boj.kr/c189a60da9c64581915fade658b118f2
        • DP[I][J] : 현재 1번째 차량의 위치가 I, 2번째 차량의 위치가 J일 때 움직임의 최소값
        • 0,0 부터 w,w 까지 차례대로 다음 최소값을 계산하여 갱신한다.
        • DP[I][J] 의 값을 기반으로, 다음 값을 계산할 수 있다. 다음 이동해야 하는 곳은 I와 J 중 큰 것에서 +1 한 것이다.
        • (다음 이동값) 에 1번 차와 2번 차가 이동할 경우를 모두 생각하며 값을 갱신한다.
        • max(i,j) + 1 = K 이라 할 때, DP[K][J] = DP[I][J] + (I 와 K 의 거리) , DP[I][K] = DP[I][J] + (J 와 K 의 거리) 이다.
        • 이를 이용하여 dp 를 작성하고 백트래킹한다.

2020년 2월 27일

  • 중하급
  • 중상급
    • 백준, 통신망 분할, 유니온 파인드
    • 백준, Mountain Climbing, 그리디
      • https://www.acmicpc.net/problem/5910
        • http://boj.kr/083f97f3611e42a4bce053386384a27c
        • Ui < Di 인 것을 A, Ui = Di 인 것을 B, Ui > Di 인 것을 C로 분류한다.
        • A, B, C 순서대로 배치한다.
        • [A 관찰]
          • 두 개만 꺼내서 어떤 순서로 배열하는게 최적인지 생각해 보자.

          • [Ua, Da] , [Ub, Db] 을 생각했을 때 [Ua, Da] , [Ub, Db]의 값은 Ua + max(Da, Ub) + Db 이다.

            [Ub, Db], [Ua, Da]의 값은 Ub + max(Db, Ua) + Da 이다. Ua < Ub 인 경우에 대소 관계가 아래 세가지로만 나뉜다.

            • Ua < Da ≤ Ub < Db
              • (A가 선행 시) : Ua + Ub + Db
              • (B가 선행 시) Ub + Db + Da
              • A가 선행하는 게 항등적으로 최적이다.
            • Ua ≤ Ub ≤ Da < Db
              • (A가 선행 시) : Ua + Da + Db
              • (A가 선행 시) : Ub + Db + Da
              • A가 선행하는 게 항등적으로 최적이다.
            • Ua ≤ Ub < Db ≤ Da
              • (A가 선행 시) : Ua + Da + Db
              • (B가 선행 시) : Ub + Db + Da
              • A 가 선행하는 게 항등적으로 최적이다.
          • 모든 경우에 A가 선행하는 게 항등적으로 이득이다. 따라서 여러 개의 A들을 가상으로 계속.. 버블 정렬 형식으로 최적화를 시키면...

          • Ui에 대해서 오름차순으로 배치하는 게 최적이다.

          • 비슷한 방식으로 A 다음에 B, C 를 배치하고. 비슷한 논리로 관찰하면..

          • C의 경우 Di 에 대하여 내림차순으로 배치하는 게 최적이다.

          • 이런 배치간격을 썼을 경우, 값은 max( minUi + sumOfDi, minDi + sumOfUi ) 이 정답이다.

2020년 2월 25일

2020년 2월 24일

2020년 2월 22일

2020년 2월 21일

2020년 2월 20일

  • 중하급
  • 중상급
    • 백준, coci 2008, 이분 탐색, 동물원 확장
      • https://www.acmicpc.net/problem/2962
      • 풀이
      • http://boj.kr/6d3f3ae9bf154eff836d4b2c5b927006
      • 시간이 10^9 이므로, O(T) 에 탐색하기 어렵다. 이분 탐색으로 공략한다.
      • 첫 번째 종이 코코넛을 따는 시간을 X 라고 하자. 그러면 두 번째 종이 코코넛을 여는 시간은 T-X가 될 것이다.
      • 각각의 원숭이는 100마리 이하므로, X 시간동안 수집할 수 있는 코코넛의 수를 계산하는 시간 복잡도는 O(100)이다.
      • X가 크면, 따는 코코넛의 수가 증가할 것이고, 반대로 여는 코코넛의 수가 감소할 것이다.
      • X 시간 기준 (따는 수)와 (여는 수)를 비교한다. 서로 같으면 탐색을 끝나고, 따는 수가 크면 X를 줄이고, 여는 수가 크면 X를 늘린다.
      • ... 만 이렇게만 하면 WA 가 뜬다! 굳이 (따는 수)와 (여는 수) 가 같을 필요가 없다. (https://www.acmicpc.net/board/view/24924)
      • X를 비교할 때, 열린 구간 [X-1의 따는 수 + 1, X의 따는 수]와 [(T-X-1)의 여는 수 + 1, (T-X)의 여는 수] 가 교집합이 있기만 하면, X는 답이 된다.
      • 이분 탐색 로직을 수정하여 제출한다 :)

2020년 2월 19일

  • 중하급
  • 중상급
    • 백준, coci 2015, PIANINO
      • https://www.acmicpc.net/problem/11924
      • 풀이
        • http://boj.kr/8893f62e23dd4c81bdd591ec8c891519
        • 건반의 증감으로만 감지하므로, 첫 번째 건반을 0으로만 맞추면 명확히 관찰할 수 있다. 예 ) 2 1 -6 -2 1 6 10 → 0 -1 -8 -4 -1 4 8
        • 건반의 증감에 따른 밀카의 연주 음색을 구한다. 예) 0 -1 -8 -4 -1 4 8 의 경우 0 -1 -2 -1 0 1 2
        • 예시의 답안 K=4 가 맞춘 건반을 보면, (-8, -2) (-4, -1) (4, 1) (8, 2) 로 건반의 증감 / 밀카의 증감 = 4 임을 알 수 있다.
        • 이를 바탕으로 인사이트를 얻어, (건반의 증감) / (밀카의 증감) 값을 모두 세서, 가장 많이 등장하는 값을 리턴한다.

2020년 2월 18일

2020년 2월 16, 17일

2020년 2월 15일

2020년 2월 14일

  • 중하급
  • 중상급
    • https://www.acmicpc.net/problem/3017
      • 풀이
      • http://boj.kr/37e67d5ecef14532b44c86141beec84c
      • b에 0부터 9까지 각각 몇 개 들어가 있는지 저장한다.
      • (a보다 크거나 같은 수 구하기)
        • a를 높은 자리수부터 찾아가면서, 최대한 일치하게끔 값을 맞춘다.
        • 더 이상 일치할 수 없을 때,
          • 그 자리수보다 큰 수를 가져올 수 있으면 일단 그것을 가져온다. 예 ) 12340, 12360은 10의 자리에서 불일치하게 된다. 0, 6을 쓸 수 있는데, 6을 가져올 수 있다.
            • 그 이후로는 가장 작은 자리수 순서대로 정렬하면서 가져온다.
          • 그 자리수보다 큰 수를 가져올 수 없으면, 기존에 일치하도록 맞추었던 것을 하나씩 복원하면서, 그 자리수 대신 큰 수를 가져올 수 있으면 그것을 가져온다.
            • 예) 32140, 32122 는 321 에서 불일치하지만, 남은 2, 2 로는 십의 자리 '4'보다 크지 않다. 따라서 32 까지로 복원하면, 1, 2 , 2 로 되돌아간다. 여기서 2는 백의 자리 '1' 보다 크므로, 끼워맞출 수 있다.
            • 그 이후로는 가장 작은 자리수 순서대로 정렬하면서 가져온다.
      • (a보다 작은 수 구하기)
        • 위와 아이디어는 동일하지만, 1의 자리까지 끝까지 자리수가 일치할 경우가 추가된다.
          • 그 경우, 하나씩 맞추었던 것을 복원하면서, 그 자리수 대신 작은 수를 가져올 수 있으면 그것을 가져온다.
          • 예) 123, 123 은 1의 자리까지 일치한다. 그러므로 1, 1 까지로 되돌린다. 남은 수는 2, 3이다. 여기서 3은 백의 자리 '2' 보다 크므로, 끼워맞출 수 있다.
          • 그 이후로는 가장 큰 자리수 순서대로 정렬하면서 가져온다.

2020년 2월 13일

2020년 2월 12일

2020년 2월 11일

2020년 2월 10일

  • 중하급
  • 중상급
    • https://www.acmicpc.net/problem/17071
      • 풀이
        • http://boj.kr/e87ad2576f3b4448829285e3a32b0c6c
        • 수빈이가 0부터 500000... 까지 모든 자리에서 최소 몇 번만에 갈 수 있는지 생각한다.
        • 만약 5번 만에 갈 수 있다면, x+1, x-1 이동을 반복하여 5번, 7번, 9번.. 등에 항상 방문할 수 있다.
        • 만약 4번 만에 갈 수 있다면, 4번, 6번, 8번... 만에 갈 수 있다.
        • 따라서 BFS 로 각 자리마다 최소로 도달할 수 있는 짝수번, 홀수번을 전탐색하여 저장한다.
        • 동생의 시간당 위치마다, 그 시간의 짝홀에 따라서 수빈이의 최소 짝/홀 도달 횟수보다 크거나 같은지 확인한다.

2020년 2월 9일

  • 중하급
  • 중상급
    • https://www.acmicpc.net/problem/2488
      • 풀이 이 문제는 마을 사람들의 몸무게에 대한 정보가 주어졌을 때, 주어진 규칙을 만족 하면서 줄다리기 값을 최소로 하는 단위 줄 편성을 찾아내는 문제이다. 기본적으로 모든 경우를 다 시도하는 방법을 시도하되, 이를 효율적으로 수행하는 것이 문제의 핵심이다. 먼저 수열을 이루는 값이 20 이상의 정수이고, 차이가 50 이하여야 한다는 조건을 생각해 보면, A 수열의 첫 구간이 결정되면 B 수열의 첫 구간의 범위는 최대 여섯 가지 중 하나로 결정되어야 함을 알 수 있다. 이렇게 첫 번째 구간을 결정하는 경 우의 수는 많아야 6×N가지이고, 첫 번째 구간이 결정되면 각 수열의 두 번째 구간 을 결정하는 경우의 수도 6×N가지이므로 O(6*N)에 모든 경우를 계산해 낼 수 있 다. 하지만 이러한 방법만으로는 모든 데이터에 대해서 제한 시간 내에 답을 낼 수 없다. 이를 조금 개선하면 시간복잡도를 O(N)으로 줄일 수 있다. 첫 구간을 결정하는 6×N가지 경우 중에서 (A수열의 첫 구간) - (B수열의 첫 구간)값이 같은 경우에는 구간에 들어가는 수의 개수가 가장 적은 것 하나만 고려해 주면 되는데, 나머지 수 를 두 번째 구간에 넣는다고 하면 같은 결과가 나기 때문이다. 따라서 많아야 100 가지 경우만을 추려 낼 수 있고, 각각에 대해서 두 번째 구간을 6×N가지 경우에 대 해 보면서 결정하면 O(N)의 시간복잡도에 문제를 해결할 수 있다.

구글 코드 잼 :)

구글 코드잼의 등록이 2020년 3월 3일부터 열립니다 :) 예선은 통과하도록 화이팅해 봅시다.

https://codingcompetitions.withgoogle.com/codejam/schedule

2020년 2월 7일, 8일

2020년 2월 6일

2020년 2월 5일

구글 코드잼 예선 :)

  • 중하급
  • 중상급
    • https://www.acmicpc.net/problem/14793
    • 풀이
      • https://www.youtube.com/watch?v=Y7GGwEKFboA
      • 화장실을 하나의 구간으로 보고, 이용한 화장실을 기준으로 구간을 계속 잘라간다고 생각한다.
      • 우선순위 큐에 현재 비어 있는 연속된 화장실의 구간을 집어 넣는다. 예를 들어, 처음에는 {0, n} 을 집어 넣는다.
      • 큐에서 꺼내서, 정중앙을 뺀 나머지 두 구간으로 만든 뒤 다시 큐에 넣는 작업을 반복한다. 예를 들어, {0, n} 을 빼서 {0, n/2}, {n/2 + 1, 0} 을 집어 넣는다.

2020년 2월 4일

2020년 2월 2, 3일

2020년 2월 1일

2020년 1월 31일

2020년 1월 30일

2020년 1월 29일

2020년 1월 28일

2020년 1월 26일

2020년 1월 24일

2020년 1월 23일

2020년 1월 22일

2020년 1월 21일

2020년 1월 20일

2020년 1월 19일

2020년 1월 18일

2020년 1월 17일

2020년 1월 15일, 16일

2020년 1월 14일

2020년 1월 13일

2020년 1월 12일

2020년 1월 11일

휴무 :)

2020년 1월 10일

2020년 1월 9일

2020년 1월 8일

2020년 1월 7일

2020년 1월 6일

2020년 1월 5일

2020년 1월 4일

2020년 1월 3일

2020년 1월 2일

2020년 1월 1일

2019년 12월 31일

2019년 12월 30일

2019년 12월 29일

2019년 12월 28일

2019년 12월 27일

2019년 12월 25일, 26일

2019년 12월 24일

2019년 12월 23일

2019년 12월 22일

2019년 12월 21일

2019년 12월 20일

2019년 12월 19일

2019년 12월 18일

2019년 12월 17일

2019년 12월 16일

2019년 12월 15일

2019년 12월 14일

2019년 12월 13일

2019년 12월 12일

2019년 12월 11일

2019년 12월 10일

2019년 12월 9일

2019년 12월 8일

2019년 12월 7일

2019년 12월 6일

2019년 12월 5일

2019년 12월 4일

2019년 12월 3일

2019년 12월 2일

2019년 12월 1일

2019년 11월 30일

2019년 11월 29일

2019년 11월 28일

2019년 11월 27일

2019년 11월 26일

2019년 11월 25일

2019년 11월 24일

2019년 11월 23일

2019년 11월 22일

2019년 11월 21일

About

매일 알고리즘 1문제를 풀어보던 카카오톡 오픈채팅방을 아카이브합니다. 현재 190명: 방문자 환영합니다.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published