매일 알고리즘을 풀어보는 단톡방 :)
https://open.kakao.com/o/g3antjMb
https://www.acmicpc.net/group/12543
[https://www.notion.so/PS-da8977089c2344dba9bdbc3d0188d286]
https://www.acmicpc.net/category/850 문의 환영
하루에 한문제씩 향유합니다.무슨 문제를 향유할지는 의견이 없으면 제가 제시합니다.의견 제안은 제가 아침에 새로운 향유문제를 올리기 전까지입니다.어려운 문제가 나왔을 때는, 4시부터 서로 힌트를 주고받습니다.밤 8시 부터 푼 문제의 코드를 공개합니다.
- 문제를 푸는 그 자체를 재밌게 즐기기.
점심 시간에 중상급 한 문제를 풀기점심 시간에 중하급 두 문제를 풀기특이한 언어로 중하급 두 문제를 풀기주중에 나온 문제를 주말에 몰아 풀고 올리기
- 종만북
- 탑코더 알고리즘 트레이닝
- 그릭포그릭
- 향유회 그룹 a.k.a 백랜디
- USACO Guide
- OI Wiki (Chinese)
https://github.com/prakhar1989/awesome-courses#algorithms
- 백준
- 릿코드
- 코드포스
- 앳코더
- 유키코더
엣코더, 코드포스 등 대회를 자주 확인할 수 있습니다. 구글 캘린더로 등록하면 유용합니다.
해커랭크 캘린더 : https://www.hackerrank.com/calendar
알고리즘 대회 캘린더 : https://competitiveprogramming.info/calendar
- 중하급
- 중상급
- Namje Adventure
- 중하급
- Word Processor
- 중상급
- Berry Picking
- 중하급
- 중상급
- 안정적인 네트워크
- 중하급
- 중상급
- 중하급
- 중상급
- 걷는 산타클로스
- 중하급
- 중상급
- Copying Books
- 중하급
- 중상급
- 중하급
- 할아버지는 유명해!
- 중상급
- 중하급
- 구글 킥스타트 2020 Round D Record Breaker
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- Data Packing (Large)
- 중상급
- 중하급
- 중상급
- Polynomial
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 트리와 경로의 길이 2
- 중하급
- 중상급
- 옥토끼는 통신교육을 풀어라!!
- 중하급
- 비밀번호 발음하기
- 중상급
- 중하급
- 프로그래머스, 디스크 컨트롤러
- 중상급
- 프로그래머스, 기지국 설치
- 중하급
- 백준, 수리공 항승
- 중상급
- AtCoder, No Need
- 중하급
- 중상급
- Code Jam, Rather Perplexing Showdown
- 중하급
- 중상급
- Dance Dance Revolution
- 중하급
- 하노이 탑 이동 순서
- 중상급
- 새로운 하노이 탑
- 중하급
- 중상급
- 차이를 최대로 2
- 중하급
- 중상급
- 트리의 높이와 너비
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 백준, 다각형의 대각선
- 중상급
- 백준, 네온사인
- https://www.acmicpc.net/problem/8907
- http://boj.kr/14935fa75c1c402ab41da943233567aa
- 단색 삼각형의 수는, 전체 삼각형의 수에서 단색이 아닌 삼각형의 수를 빼는 것입니다.
- 전체 삼각형의 수는 nC3입니다.
- 단색이 아닌 삼각형은 (파, 빨, 빨) (빨, 파, 파) 로만 이루어져 있습니다.
- 한 꼭지점을 기준으로 빨간 것 한개, 파란 것 한개를 골랐을 경우, 이것은 반드시 단색이 아닙니다.
- 각각 꼭지점을 순회하며 그 꼭지점을 지나가는 튜브의 빨간색 수, 파란색 수를 세서 (빨간색 수)*(파란색 수) 를 하면 단색이 아닌 삼각형의 두 배가 됩니다.
- 구한 값을 전체 삼각형에서 빼면 단색 삼각형 수가 됩니다.
- 중하급
- 중상급
- 팰린드롬 보행
- 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 라운드 A, 얼로케이션
- 중상급
- 구글 킥스타트 2020 라운드 A, 워크아웃
- 중하급
- 구글 킥스타트 2020 라운드 C, 안정된 벽
- 중상급
- 구글 코드잼 2017 라운드 2, 신선한 초콜렛
- 중하급
- 구글 킥스타트 2020 라운드 B, 자전거 여행
- 중상급
- 구글 킥스타트 2020 라운드 B, 버스 경로
- 중하급
- 구글 킥스타트 2020 라운드 C, 카운트다운
- 중상급
- 구글 킥스타트 2020 라운드 B, 로봇 경로 디코딩
https://tech.kakao.com/2020/07/01/2020-internship-test/
카카오 인턴십 2020 풀이
- 중하급
- 프로그래머스, 카카오 2020 블라인드 채용, 문자열 압축
- 중상급
- 프로그래머스, 카카오 인턴십 2020, 동굴 탐험
- 중하급
- 프로그래머스, 카카오 인턴십 2020, 수식 최대화
- 중상급
- 프로그래머스, 카카오 인턴십 2020, 보석 쇼핑
- 중하급
- 프로그래머스, 카카오 인턴십 2020, 키패드 누르기
- 중상급
- 프로그래머스, 카카오 인턴십 2020, 경주로 건설
- 중하급
- 중상급
- Coci 2015/2016, 2+1 세일
- 중하급
- Coci 2015/2016, 카드세트
- 중상급
- Coci 2015/2016, 풍선 맞추기
- 중하급
- 백준, 시리얼 번호
- 중상급
- 코드 잼 R2 2018, Graceful Chainsaw Jugglers
- 중하급
- 백준, 병든 나이트
- 중상급
- 중하급
- 백준, 절대값 힙
- 중상급
- 백준, 소수의 곱
- 중하급
- 백준, 트리 순회
- 중상급
- 백준, 가장 가까운 공통 조상
- 중하급
- 백준, 회사에 있는 사람
- 중상급
- 백준, N-Queen
- 중하급
- 백준, 쉬운 계단 수
- 중상급
- atcoder, Not Visible
- 중하급
- 백준, 수들의 합
- 중상급
- 백준, 두 배열의 합
- 중하급
- 중상급
- 백준, 말이 되고픈 원숭이
- 중하급
- 백준, XORXORXOR
- 중상급
- atcoder, xor battle
2020년 6월 10일
- 중하급
- 백준, 파스칼 삼각형
- 중상급
- 백준, 싸리와 버드의 피라미드
- 중하급
- 백준, 헤일스톤 수열
- 중상급
- 백준, 카드 게임
- 중하급
- 백준, 공 포장하기 1
- 중상급
- 백준, 공 포장하기 2
- 중하급
- 백준, 카드 구매하기
- 중상급
- 중하급
- 백준, DFS와 BFS
- 중상급
- 백준, K진 트리
- 중하급
- 백준, 가장 긴 감소하는 부분 수열 O(n^2)
- 중상급
- 백준, 가장 긴 증가하는 부분 수열 5 - O(nlogn)
- 중하급
- 프로그래머스, k번째 수
- 중상급
- 코드포스, Yet Another Yet Another Task
- 중하급
- 백준, 연속합
- 프로그래머스, 동적 계획법
- 중상급
- 백준, Acka의 리듬 세상
- 중하급
- 백준, 동전 2
- 중상급
- 백준, 흰색으로 만들기
- 중하급
- 프로그래머스, 가장 먼 노드
- 중상급
- 백준, 동전 던지기
- 중하급
- 프로그래머스, 제일 작은 수 제거하기
- https://programmers.co.kr/learn/courses/30/lessons/12935
- 중상급
- 프로그래머스, 크레인 인형 뽑기 게임
- https://programmers.co.kr/learn/courses/30/lessons/64061
- 중하급
- 백준, 유기농 배추
- 중상급
- 백준, 결함 게임
- 구글 킥스타트, 5월 17일자, 라운드 C
- 중하급
- 중상급
- 중하급
- 백준, 에라토스테네스의 체
- 중상급
- 백준, 곤돌라 - 교체 수열
- 중하급
- 백준, 그룹 단어 체커
- 중상급
- 코드잼, Graceful Chainsaw Jugglers
- 중하급
- 백준, 팰린드롬 만들기
- 백준, 가장 긴 증가하는 팰린드롬 부분수열
- 중하급
- 백준, 서로 다른 자연수의 합
- 중상급
- 백준, 네트워크 연결
- 중하급
- 릿코드, 두 이진 탐색 트리의 모든 원소
- 중상급
- 중하급
- 릿코드, Subarray Sum divisible by K
- 중상급
- 백준, 레모네이드 거래
- 중하급
- 백준, 가장 긴 감소하는 부분 수열
- 중상급
- 백준, King of the waves
- 중하급
- 백준, 스텔라가 치킨을 선물했어요
- 중상급
- 백준, 스티커 수집
- 중하급
- 중상급
- 백준, 색깔 통일하기
- 중하급
- 백준, 하얀 칸
- 중상급
- 백준, 프랙탈 평면
- 중하급
- 중상급
- 백준, 컵라면
- 백준, 평범한 배낭 2
- 중하급
- 백준, 최소 신장 트리, 상근이의 여행
- 중상급
- 백준, UNIST는 무엇의 약자일까?
- 중하급
- 백준, 요세푸스 문제
- 중상급
- 백준, 숫자의 신
- 중하급
- 백준, 미로에 갇힌 상근
- 중상급
- 백준, 나눌 수 없는 부분 수열
- 중하급
- 백준, 트리의 부모 찾기
- 중상급
- 백준, 최대 클리크 구하기
- 중하급
- 백준, 설탕 배달
- 중상급
- 코드 잼, 2020년, 라운드 1B 2번, 인터렉티브, Blindfolded Bullseye
- 중하급
- 백준, 분할 정복, 쿼드트리
- 중상급
- 코드 잼, 라운드 1B 2번, 미스터리 로드 사인
- https://codingcompetitions.withgoogle.com/codejam/round/0000000000007764/000000000003675b
- 중하급
- 백준, 투 포인터, 수들의 합 2
- 중상급
- 백준, 제 21대 국회의원 선거
- 코드 잼, 2018년 1B 1, 반올림 오차
- 중하급
- 중상급
- 중하급
- 중상급
- 백준, 구글 코드 잼, n제곱 계산
- 중하급
- 백준, 바이러스
- 중상급
- 중하급
- 백준, 동적 계획법, 01타일
- 중상급
-
중하급
- 백준, 피시방 알바
- https://www.acmicpc.net/problem/1453
-
중상급
- 코드 잼 1차 B 1번, 맨하탄 크레이프 카트
- https://codingcompetitions.withgoogle.com/codejam/round/0000000000051706/000000000012295c
- 중하급
- 중상급
- https://leetcode.com/problems/stamping-the-sequence/
- 그리디
- 타겟이 ababc, 스탬프가 abc 인 경우, abc 인 패턴을 찾아서 물음표로 대체한다. ab???
- 이제 a??, ab?, ?b?, ??c 등 [0개 이상의 물음표][일치하는 문자열][0개 이상의 물음표] 인 패턴을 찾아서 일치하는 문자열을 물음표로 대체한다.
- 전부 물음표가 될 때까지 방법을 반복하고, 찍었던 위치의 인덱스를 뒤집어서 반환한다.
코드잼 예선으로 스킵 :)
코드잼 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
- 중하급
- 백준, 코드 잼, 예선, 마술
- 중상급
- 백준, 코드 잼, 예선, 과자 선택기 알파
- https://www.acmicpc.net/problem/12260
- 중하급
- 중상급
- 중하급
- 백준, 균형잡힌 세상
- 중상급
- 백준, 전화번호 수수께끼 (Small)
- 중하급
- 백준, 섬의 개수
- 중상급
- 중하급
- 백준, 우선순위 큐, 절대값 힙
- 중상급
- 중하급
- 백준, 황금광 시대
- 중상급
- 백준, 목성 여행
- 중하급
- 백준, 소인수분해
- 중상급
- 백준, 열차정렬
- 중하급
- 백준, 제곱수 찾기
- 중상급
- 백준, 상남자 곽쳘용
- 중하급
- 백준, 분할 정복, 색종이 만들기
- 중상급
- 중하급
- 백준, N과 M (1)
- 중상급
- 중하급
- 중상급
- 백준, Pogo-Cow
- 중하급
- 백준, 영화감독 숌
- 중상급
- 백준, 팰린드롬 경로
- 중하급
- 백준, 큐, 카드
- leetcode, number of steps to reduce a number to zero
- 중상급
- 백준, USACO Gold, 팰린드롬 경로
- 중하급
- 백준, 분할 정복, Z
- 중상급
- 해커랭크, New Year Chaos
- 백준, OR과 쿼리
- 중하급
- 중상급
- 백준, USACO 2015, Bessie's Dream
- 중하급
-
백준, 삼성 역량 테스트, 퇴사, 브루트 포스, 전탐색
- https://www.acmicpc.net/problem/14501
- 풀이
- N<15, 시간복잡도 O(2^n) 이므로 전탐색으로도 충분히 풀 수는 있다.
- 계산 최적화를 위해 dp[i] 0~i번일까지 근무했을 때 얻는 최대값 으로 점화식을 세워서 얻을 수도 있다.
- http://boj.kr/3fa8a67e87b74d409ab80ffb6365a252
- https://www.acmicpc.net/problem/14501
-
leetcode, 정렬, K Closest Points to Origin
-
- 중상급
- 백준, 그래프, 골목길
- 백준, USACO 2015, Censor
- 중하급
- 백준, 삼성 역량 테스트, 시험 감독
- 중상급
- 백준, POI 2009, Intelligence Test
- 중하급
- 백준, 2013 coci, 농구 경기
- https://www.acmicpc.net/problem/1159
- 중상급
- 백준, 2013 coci, 귀농, 2차원 배열
- https://www.acmicpc.net/problem/1184
- 풀이
- http://boj.kr/ff78a4b28b5b47e79020b7538ab56ebc
- 모든 영역에서의 합 배열을 미리 저장해 O(1) 만에 특정한 영역의 합을 구할 수 있게 한다.
- 2차원 영역 합배열 : https://lmcoa15.tistory.com/14
- 모든 좌표를 기준으로, 우상단, 좌상단, 우하단, 좌하단에서 가능한 영역의 넓이들을 저장한다.
- 우상단의 가능넓이를 해시맵에 저장하고, 좌하단을 순회할 때 해시맵에 우하단에 저장값이 있으면, 가능짝에서 값을 하나 더한다.
- 같은 방식으로 좌상단을 계산한다.
- 시간복잡도 O(n^4) 로 아슬아슬하게 구할 수 있다.
- 중하급
- 백준, 숫자판 점프, 깊이 우선 탐색
- 중상급
- 백준, 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 번째 원소의 포함 / 불포함 여부를 기억해 낸 후 백트래킹한다.
- https://www.acmicpc.net/problem/18790
- 백준, N의 배수 (1), 동적 프로그래밍
- 중하급
- 백준, 이분 탐색, 수 찾기
- 중상급
- 중하급
- 중상급
- 백준, 조쌤포스 1
- 백준, Message Passing
- https://www.acmicpc.net/problem/13328
- 풀이
- https://www.acmicpc.net/source/18214145
- f(x) = f(x-1) + +++ f(x-d) (이전 값 d개의 합) 이다.
- 피보나치와 유사함을 이용해서 행렬을 정의할 수 있다. 1, 1, 1, 1, 1, 0, 0, 0 0, 1, 0, 0 0, 0, 1, 0 형식의 행렬을 적절히 구하면, 다음 항을 구할 수 있다.
- 해당 행렬 A의 2진 거듭제곱을 적당히 구해서, A ^ t 를 짧은 시간 안에 구해낸다.
- f(0), f(1), ... , f(d-1) 를 벡터로 만들어 행렬에 곱해서 나온 벡터의 0번째 원소를 리턴한다.
- https://www.acmicpc.net/problem/13328
- 중하급
- 백준, 동전 1
- 중상급
- 백준, Hovering Hornet
- 중하급
- 해커랭크, 퀸즈 어택
- 백준, 나이트의 이동, BFS
- https://www.acmicpc.net/problem/7562
- 풀이
- http://boj.kr/134d5a4528aa41e9af818c4ebefe54b5
- BFS 로, 턴을 하나씩 증가해나간다.
- 각 턴마다 다음에 나이트가 있을 수 있는 칸을 표기하고, 이미 방문하지 않았으면 큐에 넣는다.
- 돌아온 칸이 목표한 칸과 같으면 턴을 출력한다.
- 중상급
- 백준, coci 2015, K진 트리, DFS
- https://www.acmicpc.net/problem/11812
- 풀이
- http://boj.kr/01877f9f39fe43d1bf38869403381ac3
- https://www.acmicpc.net/blog/view/93
- 입력이 너무 크므로, O(logN) 안에 수행해야 한다.
- 계차수열을 생각하여, 각 뎁스의 맨 마지막 값을 저장한다. k=3 일 때 (트리의 각 값을 1을 빼면) 뎁스 맨 마지막 값은 0, 3, 3+9, 3+9+27... 일 것이다.
- 뎁스가 같으면, 부모가 같아질 때까지 부모로 올라가면서, 올라간 횟수 * 2 를 리턴한다.
- 뎁스가 같으면, 먼 뎁스의 자식을 뎁스가 같아질때까지 올라가면서, 올라간 횟수 + 앞서 구한 뎁스가 같을 때의 함수값 을 리턴한다.
- K=1 일 때 시간초과가 나므로, 특별히 |a-b| 를 리턴한다.
- 백준, coci 2015, K진 트리, DFS
- 중하급
- 해커랭크, Triple Sum (난이도 중급)
- 릿코드, Top K Frequent Elements (난이도 초급)
- 중상급
- 백준, 본대 산책 3
- https://www.acmicpc.net/problem/14289
- 풀이
- http://boj.kr/549fc8f7151e4a5fa12d4cb483051429
- 경로를 인접행렬로 계산하고, A 로 정의한다.
- A^D 의 1행 1열 값을 출력하는 문제이다.
- D가 너무 크므로, 선형적으로 거듭제곱을 반복하는 방식으로는 풀기 어렵다.
- log2(1,000,000,000) = 32 이므로.. A, A^2, A^4, ... A^(2^32) 값을 선계산한다.
- D 를 2의 거듭제곱의 합으로 분해하여 선계산한 값들을 꺼내어 제곱하여 내놓는다.
- 상수 커팅
- 백준, 본대 산책 3
- 중하급
- 프로그래머스, 나누어 떨어지는 숫자 배열
- 중상급
- 백준, 사과나무
-
중하급
-
프로그래머스, 쇠막대기
#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; }
-
-
중상급
- 백준, 크리스마스 선물
- 중하급
- 프로그래머스, 하샤드 수
- 백준, 부등호
- 중상급
- 중하급
- 중상급
- 백준, 리그 오브 레전설 (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 를 작성하고 백트래킹한다.
- 중하급
- 프로그래머스, 2016년
- 중상급
- 백준, 통신망 분할, 유니온 파인드
- https://www.acmicpc.net/problem/17398
- 풀이
- http://boj.kr/3bf5c99a8795496fbbf495fe456dd251
- 간선을 자르고 있는 것을 생각하지 말고, 다 잘린 그래프에서 간선을 연결하는 행위라고 생각한다.
- 최초에 잘리지 않은 쿼리들을 하나씩 이으며 합쳐진 서브 그래프의 크기를 곱해 나간다.
- 레퍼런스
- 백준, 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 가 선행하는 게 항등적으로 최적이다.
- Ua < Da ≤ Ub < Db
-
모든 경우에 A가 선행하는 게 항등적으로 이득이다. 따라서 여러 개의 A들을 가상으로 계속.. 버블 정렬 형식으로 최적화를 시키면...
-
Ui에 대해서 오름차순으로 배치하는 게 최적이다.
-
비슷한 방식으로 A 다음에 B, C 를 배치하고. 비슷한 논리로 관찰하면..
-
C의 경우 Di 에 대하여 내림차순으로 배치하는 게 최적이다.
-
이런 배치간격을 썼을 경우, 값은 max( minUi + sumOfDi, minDi + sumOfUi ) 이 정답이다.
-
- https://www.acmicpc.net/problem/5910
- 백준, 통신망 분할, 유니온 파인드
- 중하급
- 백준, coci 2010, 대회 or 인턴
- 중상급
- 백준, coci 2015, SLON
- 중하급
- 프로그래머스, n개의 최소공배수
- 중상급
- 백준, 코드잼, Hiking Raindeer(small)
- 중하급
- 프로그래머스, DFS/BFS, 네트워크
- 중상급
- 백준, coci 2015, DFS/BFS, MOLEKULE
- 중하급
- 프로그래머스, DFS, BFS, 타겟 넘버
- 중상급
- 백준, ICPC 유럽 지역, BAPC, KEEP HIM INSIDE
- 중하급
- 프로그래머스, 스택/큐, 프린터
- 중상급
- 백준, 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는 답이 된다.
- 이분 탐색 로직을 수정하여 제출한다 :)
- 백준, coci 2008, 이분 탐색, 동물원 확장
- 중하급
- 프로그래머스, 완전 탐색, 소수 찾기
- 중상급
- 백준, 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 임을 알 수 있다.
- 이를 바탕으로 인사이트를 얻어, (건반의 증감) / (밀카의 증감) 값을 모두 세서, 가장 많이 등장하는 값을 리턴한다.
- 백준, coci 2015, PIANINO
- 중하급
- 프로그래머스, 그리디, 큰 수 만들기
- 중상급
- 백준, KOI 지역본선 2004, 플로이드-와샬, 회의준비
- https://www.acmicpc.net/problem/2610
- http://boj.kr/0a4f2cee676643718a1d6eb674b06eb1
- DFS, BFS 로 서로 연결되어 있는 인원들을 묶어 위원회 아이디를 부여한다.
- 각각의 위원회 아이디마다 플로이드-와샬로 사람당 걸리는 경로를 구한다.
- 각각의 사람마다 거리의 최대값을 구해, 그것의 최소값들을 모은다.
- 회의장들을 정렬하여 출력한다.
- 백준, KOI 지역본선 2004, 플로이드-와샬, 회의준비
- 중하급
- 프로그래머스, 스택/큐, 기능개발
- 중상급
- 백준, coci 2015, 홍수
- https://www.acmicpc.net/problem/11877
- 중하급
- 프로그래머스, 해시, 위장
- https://programmers.co.kr/learn/courses/30/lessons/42578
- 중상급
- 백준, coci 2015, PERICA
- https://www.acmicpc.net/problem/11876
-
풀이
-
https://www.acmicpc.net/source/share/eeded2c1326546809068322fbccee8ba
-
오름차순으로 키들을 정렬한다.
-
k=3 일 때, 3번째 키가 출력되는 경우는 2C2이다.
-
k=3일 때, 5번째 키가 출력되는 경우는 4C2이다.
-
i번째 키가 출력되는 경우는 (i-1)C(k-1)이다.
-
짧은 시간 안에 nCk 집합을 구하는 문제로 전환된다.
- 파스칼의 삼각형 O(NK)
- 페르마의 소정리 O(N * logP)
-
- 중하급
- 중상급
- 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' 보다 크므로, 끼워맞출 수 있다.
- 그 이후로는 가장 작은 자리수 순서대로 정렬하면서 가져온다.
- 그 자리수보다 큰 수를 가져올 수 있으면 일단 그것을 가져온다.
예 ) 12340, 12360은 10의 자리에서 불일치하게 된다. 0, 6을 쓸 수 있는데, 6을 가져올 수 있다.
- (a보다 작은 수 구하기)
- 위와 아이디어는 동일하지만, 1의 자리까지 끝까지 자리수가 일치할 경우가 추가된다.
- 그 경우, 하나씩 맞추었던 것을 복원하면서, 그 자리수 대신 작은 수를 가져올 수 있으면 그것을 가져온다.
- 예) 123, 123 은 1의 자리까지 일치한다. 그러므로 1, 1 까지로 되돌린다. 남은 수는 2, 3이다. 여기서 3은 백의 자리 '2' 보다 크므로, 끼워맞출 수 있다.
- 그 이후로는 가장 큰 자리수 순서대로 정렬하면서 가져온다.
- 위와 아이디어는 동일하지만, 1의 자리까지 끝까지 자리수가 일치할 경우가 추가된다.
- https://www.acmicpc.net/problem/3017
- 중하급
- 중상급
- 중하급
- 중상급
- https://www.acmicpc.net/problem/2672
-
풀이
-
플레인 스위핑 알고리즘 O(nlogn)
- 세그먼트 트리를 이용해 최소계산으로 푸는 방법이다.
-
전체 영역 분할 탐색 O(n^3)
입력받은 전체 사각형들이 이루는 선분들을 늘려서,
바둑판 형식으로 만든다.
각 바둑판 조각들, 대략 4n^2 개를 순회하면서,
n 개의 사각형 중 그 영역을 포함하는 사각형이 있는지 판단한다.
포함하는 영역들은 넓이를 더해 반환한다.
-
입출력에 주의
- 출력 조건을 정확히 지키지 않으면 WA이다.
- 예시
- 100.00 (X) 100 (O)
- 100.1 (X) 100.10 (O)
- 100.12 (O)
-
- https://www.acmicpc.net/problem/2672
- 중하급
- 중상급
- 중하급
- 중상급
- 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 로 각 자리마다 최소로 도달할 수 있는 짝수번, 홀수번을 전탐색하여 저장한다.
- 동생의 시간당 위치마다, 그 시간의 짝홀에 따라서 수빈이의 최소 짝/홀 도달 횟수보다 크거나 같은지 확인한다.
- 풀이
- https://www.acmicpc.net/problem/17071
- 중하급
- 중상급
- 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)의 시간복잡도에 문제를 해결할 수 있다.
- https://www.acmicpc.net/problem/2488
구글 코드잼의 등록이 2020년 3월 3일부터 열립니다 :) 예선은 통과하도록 화이팅해 봅시다.
https://codingcompetitions.withgoogle.com/codejam/schedule
- 중하급
- 중상급
- https://www.acmicpc.net/problem/12169
- 풀이
- http://boj.kr/309e7c0362744abebd0521396639a0e0
- 해당 코드잼에서 가장 어려웠던 문제 :(
- https://code.google.com/codejam/contest/6224486/dashboard#s=a&a=1
- <먹기, 옮기기> 와 <옮기기, 먹기> 전략 중, 항상 <옮기기, 먹기> 전략이 최적이다.
- 따라서 전부 옮긴 뒤 먹는 것이 최적이다.
- [15, 17] → [5, 17, 10] → [5, 17, 7, 3] (별로) [15, 17] → [8, 17, 7] → [4, 17, 7, 3] (더 최적)
- [9] → [5, 4] (별로) [9] → [6, 3] → [3, 3, 3] (더 최적)
- 옮기기를 마치고 x분 후에 식사를 끝내는 전략은, 최초 팬케이크들을 적절히 옮겨서 모든 팬케이크가 x개 이하로 맞추는 전략과 동일하다.
- x 케이크를 남기기 위해서, Pi 케이크는 M(Pi) = ceil(Pi/x) -1 번 분배시켜야 한다.
- M(Pi)의 합이 최소가 되는 x를 구한다.
- 중하급
- 중상급
- https://www.acmicpc.net/problem/15422
- 풀이
- 다익스트라 문제, 일반적인 다익스트라는 {거리, 인덱스} 를 큐에 집어넣는다면, 이 문제는 {거리, 인덱스, 비행기 이용 여부} 를 큐에 집어 넣는다.
- 다음 최단 거리를 통할 때, 비행기를 향해 간다면,
- 비행기를 이미 이용했을 경우 갱신하지 않는다.
- 비행기를 이용하지 않았을 경우 {거리, 인덱스, true} 를 큐에 넣는다.
- http://boj.kr/8e70ff08c58d4599b0f33b62267b3d11
구글 코드잼 예선 :)
- 중하급
- 중상급
- https://www.acmicpc.net/problem/14793
- 풀이
- https://www.youtube.com/watch?v=Y7GGwEKFboA
- 화장실을 하나의 구간으로 보고, 이용한 화장실을 기준으로 구간을 계속 잘라간다고 생각한다.
- 우선순위 큐에 현재 비어 있는 연속된 화장실의 구간을 집어 넣는다. 예를 들어, 처음에는 {0, n} 을 집어 넣는다.
- 큐에서 꺼내서, 정중앙을 뺀 나머지 두 구간으로 만든 뒤 다시 큐에 넣는 작업을 반복한다. 예를 들어, {0, n} 을 빼서 {0, n/2}, {n/2 + 1, 0} 을 집어 넣는다.
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- https://leetcode.com/problems/is-graph-bipartite/
- 이분 매칭 (Bipartite Graph) 으로 검색해 주세요.
- 중상급
휴무 :)
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- 중하급
- 중상급
- https://www.acmicpc.net/problem/14620
- 중급
- #백트래킹 #브루트 포스 #DFS #BFS
- https://www.acmicpc.net/problem/14612
- 중상급
- #그래프 #연결 리스트 #다익스트라 #DFS
- https://www.acmicpc.net/problem/14612
- 중급
- #배열 #정렬 #우선순위 큐 #자료구조