Algorithm

백준 9466 - 텀 프로젝트

9466 - 텀 프로젝트 1. 개요 https://www.acmicpc.net/problem/9466 2. 코드 Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import sys T = int(sys.stdin.r...

백준 2146 - 다리 만들기

2146 - 다리 만들기 1. 개요 https://www.acmicpc.net/problem/2146 2. 코드 Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 4...

백준 11729 - 하노이 탑 이동 순서

11729 - 하노이 탑 이동 순서 1. 개요 https://www.acmicpc.net/problem/11729 2. 코드 Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 import sys def hanoi(n, source, to, sub): if n == 1: print(source, to) ...

백준 2667 - 단지번호붙이기

2667 - 단지번호붙이기 1. 개요 https://www.acmicpc.net/problem/2667 2. 코드 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45...

백준 7569 - 3차원 토마토

7569 - 3차원 토마토 1. 개요 https://www.acmicpc.net/problem/7569 2. 코드 Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 4...

백준 4179 - 옥상 정원 꾸미기

4179 - 옥상 정원 꾸미기 1. 개요 https://www.acmicpc.net/problem/6198 2. 코드 Python3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import sys N = int(sys.stdin.readline()) buildings = [] for _ in range(N): ...

백준 7576 - 토마토-2차원

7576 - 토마토-2차원 1. 개요 https://www.acmicpc.net/problem/7576 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ...

백준 4179번 - 불!

4179 - 불! 1. 개요 https://www.acmicpc.net/problem/4179 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48...

백준 2178번 - 미로 탐색

2178 - 미로 탐색 1. 개요 https://www.acmicpc.net/problem/2178 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 import sys from collections import ...

백준 5430번 - AC

5430 - AC 1. 개요 https://www.acmicpc.net/problem/5430 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import sys T = int(sys.stdin.readline()....

백준 4889번 - 안정적인 문자열

4889 - 안정적인 문자열 1. 개요 https://www.acmicpc.net/problem/4889 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import sys n = 1 while True: arr = sys.stdin.readline().strip() if arr[...

백준 2493번 - 탑

2493 - 탑 1. 개요 https://www.acmicpc.net/problem/2493 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import sys sys.stdin.readline() arr = list(map(int, sys.stdin.readline().split())) ret = ...

백준 5397번 - 키로거

5397 - 키로거 1. 개요 https://www.acmicpc.net/problem/5397 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import sys n = int(sys.stdin.readline()) for i in range(n): line = list(sys.stdin.read...

백준 1158번 - 요세푸스 문제

1158 - 요세푸스 문제 1. 개요 https://www.acmicpc.net/problem/1158 2. 코드 Linked List 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 ...

백준 10845번 - 큐

10845 - 큐 1. 개요 https://www.acmicpc.net/problem/10845 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import sys n = int(sys.stdin.readline().strip()) arr = [] fo...

백준 10845번 - 스택

10845 - 스택 1. 개요 https://www.acmicpc.net/problem/10828 2. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import sys n = int(sys.stdin.readline().strip()) arr = [] for _ in range(n...

백준 1475번 - 방 번호

1475 - 방 번호 1. 개요 https://www.acmicpc.net/problem/1475 2. 코드 1 2 3 4 5 6 7 8 9 import sys, math # N = sys.stdin.readline() # 왜 런타임 에러?.. N = input() arr = [0,]*10 for i in N: arr[int(i)] +...

백준 1406번 - 에디터

1406 - 에디터 1. 개요 https://www.acmicpc.net/problem/1406 2. 코드 LinkedList version 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41...

2019 카카오 겨울 인턴 4번 - 호텔 방 배정

https://programmers.co.kr/learn/courses/30/lessons/64063 연결 리스트(Linked List) 입력 배열의 크기가 최대 20만 이므로, 꽤 크다. 방이 이미 배정 됐을때 그 다음 방을 찾기 위해서 순차 탐색만 하면 시간이 너무 오래 걸린다. 비어 있는 방을 빠르게 찾기 위해서는 연결 리스트(Linked ...

2019 카카오 겨울 인턴 3번 - 불량 사용자

https://programmers.co.kr/learn/courses/30/lessons/64064 이 문제는 각 제재 아이디에 해당하는 응모 아이디를 선별해서 가능한 모든 조합을 구하면 된다. 포인트는 각 제재 아이디는 응모 아이디 하나에 무조건 매칭되어야 한다. 예를 들어 제재 아이디: *a*, *** 응모 아이디: aaa, bbb 인 ...

2019 카카오 겨울 인턴 2번 - 튜플

https://programmers.co.kr/learn/courses/30/lessons/64065 문제 이해를 잘 못 하는 사람이 많은데, 나도 코딩테스트때 좀 헤맸었다. 1 2 3 4 5 6 { {1,2,3}, {2,1}, {1,2,4,3}, {2} } 두 번째 입력 예제를 보면 각 원소의 개수가 모두 다른 것...

2019 카카오 겨울 인턴 1번 - 쇠막대기

https://programmers.co.kr/learn/courses/30/lessons/42585 자바스크립트(javascript) 연습겸 풀었던 문제다. 문제 자체는 간단하다. 스택을 사용해서 괄호가 닫히는 경우만 잘 처리 해주면 된다. 괄호가 닫혔을때 취해야 하는 경우의 수는 두 가지인데, 레이저 위치인 경우’()’ ...

백준 16323번 - Intergalactic Bidding

https://www.acmicpc.net/problem/16323 영어 번역만 잘 하면 쉬운 문제다. 주어진 입찰 금액을 입찰자들이 제시한 금액으로 채운다. 입찰자들이 제시한 금액을 선택했을때 합이 주어진 입찰 금액과 같아야 한다. 먼저 입찰자들을 제시 금액 내림차순으로 정렬한 후에 남은 입찰 금액보다 i번째 ...

백준 17351번 - 3루수는 몰라

https://www.acmicpc.net/problem/17351 문자열 ‘MOLA’를 세는 임시 문자열과 개수가 저장될 DP 배열을 만든다. 문제를 해결하기 위해서는 제공된 입력 문자 N*N을 2중 for문으로 탐색한다. 제공된 입력 문자 한 칸을 탐색할 때마다 DP 배열에서 똑같은 위치에 해당하는 곳에 처음 언급했던 ‘임시 문자열’과 개수를...

백준 16637번 - 괄호 추가하기

https://www.acmicpc.net/problem/16637 모든 자리에 괄호를 대입해 완전탐색하여 최대값을 찾아야 한다. 나는 그냥 간단하게 재귀 탐색으로 풀었다. 내가 푼 코드 중에서 다음과 같은 함수가 있는데 1 2 def ev(a,b,c): return eval(str(a)+b+str(c)) 이는 정수 a, c를 b에 ...

백준 11727번 - 2xn 타일링 2

https://www.acmicpc.net/problem/11727 DP(동적프로그래밍) 문제이긴 한데, 간단한 규칙을 보인다. 타일이 한 개 있을 때부터 순서대로 1, 3, 5, 11, 21 … 위와 같은 규칙을 보인다. 규칙을 수식으로 표현하면 다음과 같다. 1 a[i] = a[i-1]+a[i-1]*2 전체 코드는 다음과 같다. ...

백준 11726번 - 2×n 타일링

일단 이 문제는 피보나치 수열의 패턴을 갖는 문제다. 따라서 다음과 같이 짧은 코드로 풀 수 있다. 파이썬 코드 1 2 3 4 cache = [1 for _ in range(int(input()) + 1)] for i in range(2, len(cache)): cache[i] = cache[i-2] + cache[i-1] print(in...

백준 11053번 - 가장 긴 증가하는 부분 수열

https://www.acmicpc.net/problem/11053 DP(동적 프로그래밍, 다이나믹 프로그래밍) 문제의 기본이다. 응용되는 DP 문제가 많다. 꼭 풀어보길 권하는 문제이다. 앞 부분부터 서서히 부분집합을 늘려간다. 부분집합 안에서 i번째 수보다 i+1번째 수가 클 때, (이전 크기의...

백준 10844번 - 쉬운 계단 수

https://www.acmicpc.net/problem/10844 DP(다이나믹 프로그래밍, 동적 프로그래밍) 문제이다. 계단의 길이가 1자리일때에는 다음과 같이 0부터 9까지의 숫자 중 하나만 올 수 있다. 단, 계단 길이가 1자리에서 끝나면 0이 오는 경우는 빼므로 총 9개의 경우가 생긴다. 계단 길이가 2일때는 다음과 같다. 진행 ...

백준 9465번 - 스티커

https://www.acmicpc.net/problem/9465 전형적인 DP(다이나믹 프로그래밍, 동적계획법)문제다. 1 2 matrix[0][j] = Math.max(matrix[1][j-1], matrix[1][j-2]) + sticker[0][j-1]; matrix[1][j] = Math.max(matrix[0][j-1], matrix[0...

백준 5874번 - 소를 찾아라

https://www.acmicpc.net/problem/5874 풀 때에는 몰랐는데 지금 보니 문제가 좀 이상하다. 힌트도 예제 입력과 다른 것 같고, 출력의 설명도 뭔가 빠져있다. 문제 자체는 간단하다. (( 과 ))을 세어서 나올 수 있는 순서쌍을 구하면 된다. 자세히는 “(“의 개수를 “)”를 찾은 개수만큼 더한다. ( 다음에 오는 “)...

백준 4963번 - 섬의 개수

https://www.acmicpc.net/problem/4963 이 문제를 풀었을 때가 알고리즘 공부를 막 시작했을때라 코드가 많이 더럽다. 지금 보니 불필요한 부분도 많이 보인다. 그 때 헤매었던 부분 중 하나는 메모리 초과다. 섬을 탐색할 때 재귀를 사용했는데, 이미 탐색한 섬을 체크하는 부분이 재귀를 들어가기 전이 아니고 들어가고 나서 ...

백준 2816번 - 디지털 티비

https://www.acmicpc.net/problem/2816 이 문제는 스페셜저지다. KBS1, KBS2 를 제외한 나머지 채널들의 순서가 상관 없고, 최소한 움직임 개수를 구하라고 한 것도 아니니(아마도?) 여러 가지의 답이 나올 수 있다. 나는 KBS1과 KBS2의 순번(인덱스)을 저장해서 해당 순번만큼 화살표를 아래로 움직이고(리모컨...

백준 2669번 - 직사각형 네개의 합집합의 면적 구하기

https://www.acmicpc.net/problem/2669 그냥 간단하게 2차배열을 만들고 전부 0으로 채운다. 입력으로 직사각형의 좌표가 들어오면, 좌표 안에 해당하는 2차배열의 칸들을 1로 채운다. 전부 채우고 1의 개수를 구하면 이것이 답이다. 파이썬 코드 1 2 3 4 5 6 7 8 9 10 11 import sys a = [[...

백준 2668번 - 숫자고르기

https://www.acmicpc.net/problem/2668 이 문제에서는 유연하게 집합(set)을 활용할 수 있는 파이썬이 좋은 것 같다. 나는 숫자와 지금까지 합한 숫자들의 길이를 한꺼번에 집합에 넣어서 깊이우선탐색을 돌렸다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import sys N =...

백준 2660번 - 회장뽑기

https://www.acmicpc.net/problem/2660 너비우선탐색으로 모든 회원들의 관계를 파악한다. 관계의 친밀도를 저장하는 2차 배열을 두고 각각의 인덱스가 회원의 번호를 나타내게 하여 인덱스를 이용해 회원들의 친밀도를 한 번에 볼 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2...

백준 2636번 - 치즈

https://www.acmicpc.net/problem/2636 처음에는 치즈 안쪽에서 탐색해서 바깥쪽의 치즈만 녹이는 방식으로 접근하려 했다. 그런데 그렇게 하면 치즈 안의 기포가 있는 부분은 녹지 않아야 하는데 내 방식대로 하면 녹게 된다. 따라서 치즈가 없는 부분을 탐색하다가 공기와 맞닿아 있는 부분의 치즈만 녹인다. 이렇게 하면 치즈 ...

백준 2628번 - 종이자르기

https://www.acmicpc.net/problem/2628 아주 간단하다. 세로로 잘라야 하는 배열과 가로로 잘라야 하는 배열을 두고 입력을 받아 각각 채운다. 그 다음 이 두 배열(a,b 배열)을 정렬시킨 후에 넓이를 구해 비교하면 된다. 넓이를 구해 비교하는 부분을 자세히 설명해 보겠다. 넓이를 구하기 위해서는 잘려진 종이의 1.가...

백준 2659번 - 십자카드 문제

https://www.acmicpc.net/problem/2659 먼저 입력받은 숫자를 시계수로 만들고, 이보다 작은 시계수의 개수를 구하는 방법으로 풀었다. 지금 보니 이게 최선의 알고리즘인가 싶다. 무엇보다 1 t = str(i)+str(j)+str(k)+str(l) 이 문장이 마음에 안 드는데, 이는 f스트링을 사용해서 메모리를 더 적...

백준 2643번 - 색종이 올려 놓기

https://www.acmicpc.net/problem/2643 일단 먼저 파이썬으로 짠 코드를 보자. (정답코드이다) 아주 간단하다. 1 2 3 4 5 6 7 8 9 10 11 import sys n = int(input()) a = [sorted(list(map(int, sys.stdin.readline().split(" ")))) for ...

백준 2642번 - 전개도

처음에는 어떻게 접근해야할 지 몰랐지만 알고보니 간단했다. 우선 목표에 도달하기 위해서는 두 가지를 주목해야 한다. 모든 면은 하나의 면만 마주보아야 한다. 1번이 만족하면 숫자 1이 마주보는 면을 찾아야 한다. 따라서 각각의 면이 어떠한 면을 마주보는지 알면 2번은 자연스럽게 해결된다. 각 면이 어떤 면...

백준 2635번 - 수 이어가기

https://www.acmicpc.net/problem/2635 입력 수를 재귀로 탐색하며 풀었다. 여기서 포인트는 두 번째 수가 첫 번째 수의 3/4~2/4만큼의 값을 가진다는 것이다. 예를 들어 입력값이 100이면 두 번째로 와야 하는 수는 100의 3/4~2/4인 75~50 사이에 있다. 물론 이 다음에 올 숫자도 그렇다. 다음에 오는...

백준 2579번 - 계단 오르기

다이나믹 프로그래밍 문제다. 나는 자바로 풀었다. 3번 연속 계단을 밟지 않고 최대값을 찾는 방향으로 진행하면 된다. 시간복잡도 : O(n) 전체 코드는 다음과 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import java.util.Scanner; public class Main { publ...

백준 2193번 - 이친구

https://www.acmicpc.net/problem/2193 다이나믹 프로그래밍 입문 문제다. 쉬운지는 모르겠지만 간단한 문제다. 1이 연속으로 존재하면 안 되니, 새로운 자리수를 만드려면 이전 자리수가 반드시 0으로 끝나야 한다. 따라서 i-1번째에 0으로 끝난 경우와 i-2번째에 0으로 끝난 경우를 합하면 i번째의 값이 나온다. 즉,...

백준 2156번 - 포도주 시식

3잔 연속으로 마실 수 없는 것만 기억하면 쉽게 동적 프로그래밍으로 풀 수 있다. 경우의 수는 다음과 같다. i번째를 안 마신 경우 i-1번째를 안 마신 경우 i-2번째를 안 마신 경우   i-3 i-2 i-3 i ...

백준 1244번 - 스위치 켜고 끄기

https://www.acmicpc.net/problem/1244 정보올림피아드 2000년도 초등부 문제로 정답률은 낮지만 쉬운 문제다. 문제에서 1. 남학생이 스위치를 조작할 때와 2. 여학생이 스위치를 조작할 때를 구분할 수 있다. 남학생 같은 경우는 몰아서 스위치를 탐색하는 시간을 줄일 수 있지만, 여학생 같은 경우는 조건부 스위치 조작이...

백준 1932번 - 정수 삼각형

https://www.acmicpc.net/problem/1932 동적 프로그래밍 문제다. 입력 데이터를 전부 2차 배열에 넣고 탐색한다. 왼쪽 위에서 내려올때와 오른쪽 위에서 내려올때를 구분해서 DP 배열을 완성시키면 된다. (i,j) 위치에서의 최대값을 구한다면, (i-1,j)과 (i-1,j-1) 중 더 큰 값에 (i,j)의 값을 더해서 ...

백준 1931번 - 회의실배정

https://www.acmicpc.net/problem/1931 정답률은 낮지만 쉬운 문제다. 회의가 빨리 끝나는 것부터 배정하면 된다. 회의가 빨리 끝나는 것이 무엇인지 판단하려면 정렬해두고 뽑거나 회의를 뽑을 때마다 전체를 탐색하는 방법 이 있겠다. 2번 방법은 시간복잡도가 N^2이기 때문에 패스...

백준 1912번 - 연속합

https://www.acmicpc.net/problem/1912 정답률 27%로 꽤 낮은 편에 속한다. 동적 프로그래밍으로 풀면 쉽다. …,(i-2),(i-1)번째 까지의 sum에 i번째의 값을 더한다. 이 값이 양수이면 i번째 값을 채택하고, 아니라면 sum을 0으로 초기화 후 (i+1)부터 다시 쌓나 나간다. 그리고 sum이 가장 높았을...

백준 1413번 - 박스 안의 열쇠

https://www.acmicpc.net/problem/1413 코드를 보면 간단해 보이는데 애를 먹었던 문제다. 이 문제에서 원하는 출력은 열쇠를 얻는 경우의 수가 아닌 확률이다. 따라서 (주어진 폭탄만을 사용해 모든 상자를 연 경우의 수)/(모든 상자를 연 경우의 수) 의 형태로 출력해야 한다. (주어진 폭탄만을 사용해 모든 상자를 연 경...

백준 1149번 - RGB거리

https://www.acmicpc.net/problem/1149 크게 보면 [이전까지의 집들을 칠하는 최소 비용 + 현재 집을 칠하는 비용] 중에서 최소값을 선택해 나가면 된다. 이웃하는 집(현재 위치의 집에서 이전 집과 다음 집) 끼리는 같은 색을 사용할 수 없으니, [이전까지의 집들을 칠하는 최소 비용 + 현재 집을 칠하는 비용]의 경우는 ...

백준 9663번 - N-Queen

https://www.acmicpc.net/problem/9663 일단 퀸은 대각선, 상하좌우 모두 움직일 수 있으므로, 퀸을 배치할때 배치할 퀸 주변 8방향에는 다른 퀸이 없어야 한다. 이 전제를 베이스로 백트래킹을 하다 보면 퀸을 배치할 수 있는 모든 경우의 수가 나온다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

백준 9251번 - LCS

https://www.acmicpc.net/problem/9251 최장 공통 부분 수열(LCS)문제다. DFS를 써서 해봤는데 시간이 너무 오래 걸린다. DP를 쓰는 것이 가장 무난하다. 행에는 첫 번쨰 입력 문자들을 배치하고, 열에는 두 번째 입력 문자들을 배치하여, 행과 열이 같은 문자라면 이전 상태에서의 최대값에 +1을 해준 값이 현재 ...

백준 9095번 - 1,2,3 더하기

https://www.acmicpc.net/problem/9095 전형적인 DP 문제다. 0부터 높여가면서 이전에 거쳐온 숫자들 중에서 가장 많은 경우의 수를 고르고, 해당 숫자에 1을 증가시켜서 DP 배열에 저장한다. 얼핏 보면 피보나치와도 비슷하다. 1 2 3 4 5 6 7 8 9 10 11 T = int(input()) n_list = [...

백준 1463번 - 1로 만들기

https://www.acmicpc.net/problem/1463 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟...