알고리즘 50

백준 알고리즘(파이썬) - 2798번

https://www.acmicpc.net/problem/2798 2798번: 블랙잭 첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장 www.acmicpc.net 둘째줄에 주어진 수들 중 세 수를 뽑아 합을 정해진 수에 가장 가깝게 만들면 된다. 1 2 3 4 5 6 7 8 9 10 N, M = map(int, input().split()) numbers = list(map(int, input().split())) blackjack = 0 for i in range(N-2): for j in range(i+1, N-1): f..

알고리즘 2021.08.23

백준 알고리즘(파이썬) - 11729번

하노이 탑 이동 순서 https://www.acmicpc.net/problem/11729 11729번: 하노이 탑 이동 순서 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 www.acmicpc.net 하노이탑의 원리는 알겠는데 수행 과정을 출력하는 방법을 생각해봐도 떠오르지 않았다. 함수에 변수를 하나만 넣을 생각을 해서 탑을 옮기는데 어떨 땐 첫 번째 막대에서, 어떨 땐 두 번째 막대에서 이동해야 하는 것을 어떻게 다뤄야 할지 몰랐다. 결국 검색을 통해 답을 알아봤다. 1 2 3 4 5 6 7 8 9 10 11 12 def hanoi(n, start, end..

알고리즘 2021.08.18

백준 - 2447번 / map(), join()

별 찍기 https://www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 www.acmicpc.net 문제를 보고 원리도 이해했고, 코딩이 아닌 스스로 문제를 풀려면 가능했다. 그런데 사람이 생각할땐 문제의 3*3 패턴을 기준으로 생각해서 어떻게 해야할지 감이 오지 않았다. *** *** * * 옆에 * * 을 어떻게 이어서 출력할 수 있을까 고민했지만 답을 찾지 못했다ㅠ *** *** 결국 고민하다가 인터넷 검색을 통해 찾아봤다. 1 2 3 4 5 6 7 8 ..

알고리즘 2021.08.17

백준 - 10870번

피보나치 수 https://www.acmicpc.net/problem/10870 10870번: 피보나치 수 5 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 www.acmicpc.net 피보나치의 수는 0번째 수 = 0, 첫 번째 수 = 1로 정해져 있다. 1 2 3 4 5 6 7 def fibonacci(num): if num == 0: return 0 elif num == 1: return 1 else: return fibonacci(num - 1) + fibonacci(num - 2) n = int(input()) prin..

알고리즘 2021.08.13

백준 - 10872번

팩토리얼 https://www.acmicpc.net/problem/10872 10872번: 팩토리얼 0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오. www.acmicpc.net 팩토리얼은 정의에 따라 재귀함수로 쉽게 구할 수 있다. 0!과 1!을 1로 반환해주면, 나머지 값들은 자연스럽게 구할 수 있다. 1 2 3 4 5 6 7 def factorial(num): if num == 0: return 1 elif num == 1: return 1 else: return num * factorial(num - 1) N = int(input()) print(factorial(N)) cs

알고리즘 2021.08.13

백준 - 1002번

터렛 https://www.acmicpc.net/problem/1002 1002번: 터렛 각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다. www.acmicpc.net 두 원의 접점의 개수를 구하는 문제다. 기하학 문제를 푼게 너무 오랜만이어서 여러가지 조건을 빠뜨리지 않는 것이 까다롭게 느껴졌다. 두 원의 중심, (x1, y1)과 (x2, y2)사이의 거리가 0인 경우와 아닌 경우로 크게 나눠서 d == 0인 경우를 먼저 처리하고 continue로 다음 케이스를 처리하도록 만들었다. d != 0인 경우는 세 경우가 있어서 if문을 사용했다. 만나지 않는 경우와 한 점에서 만난 경우는 or로, 마지막의 두 점..

알고리즘 2021.08.11

백준 - 3053번

택시 기하학 https://www.acmicpc.net/problem/3053 3053번: 택시 기하학 첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다. www.acmicpc.net 택시 기하학에서의 원과 유클리드 기하학에서의 원의 넓이를 구해야 한다. 각각 원은 다음과 같이 그릴 수 있다. 택시 기하학에서의 원은 우리가 흔히 아는 마름모 모양이다. 그래서 넓이를 구하는 방법도 다르다. 파이를 값을 명시해줄까 하다가 math 모듈을 가져와서 사용했다. 1 2 3 4 5 import math r = int(input()) print(f"{math.pi * r**2:.6f}") print(..

알고리즘 2021.08.11

백준 - 4153번

직각삼각형 https://www.acmicpc.net/problem/4153 4153번: 직각삼각형 입력은 여러개의 테스트케이스로 주어지며 마지막줄에는 0 0 0이 입력된다. 각 테스트케이스는 모두 30,000보다 작은 양의 정수로 주어지며, 각 입력은 변의 길이를 의미한다. www.acmicpc.net 처음엔 예제의 입력값들이 작은 수에서 큰 수 순서대로 입력되길래 피타고라스 정리만 확인하도록 작성했더니 틀렸다고 나와서 가장 큰 수를 고르는 작업을 추가했다. 1 2 3 4 5 6 7 8 9 while True: case = list(map(int, input().split())) if sum(case) == 0: break case.sort() a, b, c = case if c ** 2 == a**2..

알고리즘 2021.08.10

백준 - 3009번

네 번째 점 https://www.acmicpc.net/problem/3009 3009번: 네 번째 점 세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오. www.acmicpc.net 문제에서 만들어지는 직사각형이 축에 평행한 직사각형이라고 했으니 만들어지는 직사각형은 다음과 같이 그릴 수 있다. 모든 좌표값을 모아서 본다면 x축은 a가 2번, b가 2번 사용되고 y축은 x가 2번, y가 2번 사용된다. 입력받은 세 좌표들을 보고 한 번만 나온 값들을 적으면 되는 것이다. 코드로는 어떻게 찾아야 할지 고민하다가 list와 set을 사용했다. 1 2 3 4 5 6 7 8 x1, y1 = map(int, input().split()) x2, y2 =..

알고리즘 2021.08.10