알고리즘/백준 문제풀이 52

[백준] 11729 하노이탑 이동 순서 파이썬 풀이 (재귀)

코드 def hanoi(disk, start, mid, end): if disk == 1: print(start, end) else: hanoi(disk - 1, start, end, mid) print(start, end) hanoi(disk - 1, mid, start, end) total_disk = int(input()) total_mvmt = 0 for disk in range(total_disk): total_mvmt = total_mvmt * 2 total_mvmt += 1 print(total_mvmt) hanoi(total_disk, 1, 2, 3) 풀이 하노이탑 옮기기의 원리이다 5개의 탑을 3번으로 옮기려면 일단 4개를 중간으로 옮겨놓고 5번을 3번으로 옮긴다음 중간에 있던 4개를 3..

[백준] 2805 나무자르기 파이썬 풀이 (이분탐색)

코드(PYPY3) n, m = map(int, input().split()) tree_list = list(map(int, input().split())) cut_min = 0 cut_max = max(tree_list) result_h = 0 while cut_min h: get += tree-h # 나무를 충분히 가져갔다. 절단기를 올려보자. if get >= m: result_h = h cut_min = h + 1 else: # 나무가 부족하다. 절단기를 내려야겠다. cut_max = h - 1 print(result_h) 풀이 처음에 이해가 안갔던 점은 왜 min을 0부터 시작하는지였다. 나무 높이 중에 가장 작은걸로 하면 안되나 했는데 나무 높이가 다 똑같을 수도 있기때문에 0으로 min을 설정..

[백준] 1929 소수 구하기 파이썬 풀이 (기본수학2)

코드 x, y = map(int, input().split()) for i in range(x, y+1): if i == 1: #1은 소수가 아뉘지! continue for j in range(2, int(i** 0.5)+1 ): if i%j==0: break else: print(i) 풀이 소수는 자신과 1밖에 약수가 없는 수이다. 그럼 모든 수를 돌면서 나누어 떨어지는 수가 있는지 없는지 보면 된다! 그런데 꼭 모든 수를 봐야할까! 해당 수의 제곱근까지만 나눠보면 된다. 약수는 대칭으로 이루어져있기 때문에 (예) 12의 약수는 1 2 3 4 6 12 / 1*12 , 2*6, 3*4 로 대칭 25의 약수는 1 5 25 / 1*25 , 5*5 로 대칭 제곱근 보다 같거나 작은 수까지만 나눠보고 나누어 떨..

[백준] 10250 ACM호텔 파이썬 풀이 (기본 수학1)

코드 num = int(input()) for i in range(num): H,W,N = map(int,input().split()) count = 1 while N>H : N = N-H count += 1 #방 호수 # print(N, count) if count2호->3호 .. 이렇게 넘어가야한다 손님이 20번째 손님이면 6번째 손님까지 1호/ 7~12번째 손님까지 2호/ 13~18번째 손님까지 3호라인/ 19~ 번째 부터 4호라인에 가야하고 19번부터 4호라인 시작이므로 20번째 손님은 204호에 가야한다 여기서 치면 N은 2가 남아있을 것이고 count는 4가 되어있겠다. count가 10이하라는 것은 방 호수가 9호까지라는 뜻이다. 1자리 수일때는 109 108호 처럼 0이 중간에 붙어야하니까..

[백준] 2609 최대 공약수와 최소 공배수 파이썬 풀이 (정수론 및 조합론)

코드 A,B = map(int, input().split()) # 최대 공약수는 # 둘중에 작은 수와 큰수%작은수와의 최대공약수와 같다 # 작은 수가 0이 될때까지 반복한다. 그럼 큰 수가 최대 공약수이다. a,b = A,B while b!=0: a = a % b a, b = b, a gcd = a print(gcd) lcm = A * B//a print(lcm) 풀이 최대 공약수를 구하는 공식 둘중에 작은 수와 큰수와 작은수를 나눈 나머지와의 최대공약수와 같다 24와 18의 최대 공약수 = 18(작은수)와 6(24%18)의 최대 공약수 = 6(작은수)와 0(18%6)의 최대공약수 작은수가 0이 되면 그때 큰 수가 최대 공약수가 된다 최소 공배수는 주어진 수 하나는 그대로 곱하고 하나는 최대공약수로 나눠..

[백준] 1037 약수 파이썬 풀이 (정수론 및 조합론)

코드 num = int(input()) #개수 real = list(map(int,input().split())) real.sort() print(real[0] * real[-1]) 풀이 8의 약수는 1 2 4 8 인데 이 중에서 1이랑 8을 빼면 2 4가 남는다 8은 2*4로 이루어져있다. 12 으로 보자면 1 2 3 4 6 12 인데 이 중에서 1과 12를 빼면 2346이 남는다 12는 2*6이나 3*4로 만들 수 있다. 따라서 진정한 약수로 주어진 수들을 오름차순으로 정렬하고 첫번째 수와 마지막 수를 곱하면 원래 수가 나온다.

[백준] 2869 달팽이는 올라가고 싶다 파이썬 풀이 (기본 수학 1)

코드 up,down,tree = map(int, input().split()) snail = 0 #달팽이의 높이 day = 0 # while snail0: day = (tree-down)//(up-down)+1 else: day = (tree-down)//(up-down) print(day) 풀이 이 문제는 while문으로 풀면 시간 초과가 나온다 그래서 입력이 되자마자 바로 출력하도록 해야한다. 이해하기 되게 까다로운 문제였다. 하지만 이해해보자! 원래 문제로 따지자면 낮에2를 올라가고 밤에 1을 내려오고를 반복하다가 딱 높이에 도달하면 밤에 내려오지 않는다. 그런데 일단 그것을 고려하지말고 매일 2-1씩 올라간다고 치자 그럼 5(높이)에서 1(내려오는 만큼)을 뺀 것 까지 딱 올라가면 되는거다 왜냐 ..

[백준] 1436 영화감독 숌 파이썬 풀이 (브루트포스)

코드 n = int(input()) result = 666 while n != 0: if "666" in str(result): n -= 1 result += 1 print(result-1) 풀이 부르트포스 문제이다 무식하게 푸는 문제 1666 , 2666, 3666 이렇게 앞에 숫자를 붙이면 될 것 같지만 6660 6661 6662 이런것도 고려해야한다 n이 2라고 가정하면 정답은 1666이 나와야하는데 666부터 시작해서 하나씩 올려가면서 667 668 669.... 1666까지 666이 있는지 확인하고 while문 안에서 1666일때 result에 +1을 하고 break되므로 result-1를 출력한다