코딩테스트 59

백준 2839 - 설탕 배달

처음 든 생각 - 브루트 포스해도 시간 복잡도가 괜찮을까? -> 최대 50000이니깐 O(N)으로 한쪽으로만 탐색을 다 하면 충분하겠네 나의 답 import sys input = sys.stdin.readline N = int(input()) three = N // 3 five = 0 isPossible = False result = 10000000 while three >=0: if (N - (three * 3)) % 5 == 0: five = (N - (three * 3)) // 5 result = min(result, three + five) isPossible = True three -= 1 if isPossible: print(result) else: print(-1) 사용될 3의 개수의 최댓값..

백준 1018 - 체스판 다시 칠하기

처음 든 생각 - 8*8 이라는 체스판의 크기를 일정하므로 시작점에 대한 좌표를 기준으로 가로 8개, 세로 8개를 세면 되겠다. - 다시 칠해야하는 개수는 정답 후보군이 2개 밖에 없으므로 정답을 하드코딩하여 비교해준다. 나의 답 import sys input= sys.stdin.readline N, M = map(int,input().split()) ans1 = [ ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B', 'W', 'B', 'W'], ['W', 'B', 'W', 'B', 'W', 'B', 'W', 'B'], ['B', 'W', 'B', 'W', 'B..

백준 19532 - 수학은 비대면강의입니다

처음 든 생각 - 연립 방정식을 해결했던 과정을 하나씩 복기해보자 1. x또는 y의 계수를 최소공배수로 맞춰준다 2. 두 개의 식을 빼서 x 또는 y를 구한다 3. 구한 하나의 변수를 기준으로 계산하여 나머지 변수의 값을 찾는다. - 최소공배수는 (두 수의 곱) / (두 수의 최대 공약수) 로 구할 수 있다. math.gcd를 사용하자. 나의 답 import sys, math input= sys.stdin.readline a,b,c,d,e,f = map(int,input().split()) if a == 0: y = c // b x = (f-e*y) // d print(x,y,sep=' ') elif d == 0: y = f // e x = (c-b*y) // a print(x,y,sep=' ') eli..

백준 14889 - 스타트와 링크

처음 든 생각 - 조합을 백트래킹으로 구현해서 팀을 만든 다음, 나머지 팀도 구해서 각각의 능력치를 비교해주면 되겠다. 나의 답 import sys input = sys.stdin.readline N = int(input()) arr = [] for _ in range(N): arr.append(list(map(int, input().split()))) result= 10000 t1 = [] def f(p): if len(t1) == N//2: global result t2 = [j for j in range(N) if j not in t1] sum1 = 0 for k in t1: for l in t1: sum1 += arr[k][l] for m in t2: for n in t2: sum1 -= arr[..

백준 14888 - 연산자 끼워넣기

처음 든 생각 - 연산자를 하나씩 다 끼워넣어서 확인해도 될까? -> 피연산자가 최대 11개 이므로 연산자는 10개 사용 가능 즉, 10! 가지의 경우의 수가 최대이므로 완전 탐색해도 되겠다. - 그 다음은 백트래킹해가면서 모든 연산을 재귀적으로 수행하면 되겠다 나의 답 import sys input = sys.stdin.readline N = int(input()) arr = list(map(int, input().split())) operators_list = list(map(int,input().split())) max_value = -10000000000 min_value = 10000000000 def search(idx, operators,result): if idx == N: global m..

백준 1629 - 곱셈

처음 든 생각 - 일단 A, B, C 범위가 심상치가 않네 이건 뭔가가 숨겨져 있다. 그래서 구글링을 좀 해서 풀었다. 나의 답 import sys input = sys.stdin.readline A,B,C = map(int,input().split()) def p(n): if n==1: return A % C else: tmp = p(n//2) if n%2 == 0: return tmp*tmp % C else: return tmp* tmp * A % C print(p(B)) 먼저 코드 설명에 분할 정복을 이용한 거듭제곱 알고리즘 부터 살펴보자. https://hbj0209.tistory.com/43 [Algorithm] 분할정복을 이용한 거듭제곱 # 분할정복을 이용한 거듭제곱 - C**n연산은 x를 n..

백준 1780 - 종이의 개수

처음 든 생각 - 어제 한 쿼드트리랑 구조가 아예 똑같고 나누는 숫자만 다르네 - 0,1,-1로 다 차있는지 아닌지 비교해서 아니면 분할해서 다시 검색하는 방식으로 재귀를 구성하면 되겠다. 나의 답 import sys input = sys.stdin.readline N = int(input()) arr = [list(input().split()) for _ in range(N) ] zero = 0 one = 0 minus = 0 def nine_tree(x,y,n): global zero, one, minus total = 0 start = arr[x][y] for i in range(x,x+n): for j in range(y,y+n): if start != arr[i][j]: total = float..

백준 1992 - 쿼드트리

처음 든 생각 - 아까 복습한 색종이 만들기 문제랑 완전 판박이네 - 4개로 분할할 때에 추가적으로 괄호가 들어가야하네 - 모두 0/1일 때 결과를 리턴함으로서 재귀 리턴 조건을 맞춰주고 - 4개로 분할할 경우 괄호를 포함한 재귀함수를 리턴해야겠다. 나의 답 import sys input = sys.stdin.readline N = int(input()) arr = [list(input()) for _ in range(N) ] def search(x,y,n): zero_count = 0 for i in range(n): for j in range(n): if arr[x+i][y+j] == "0": zero_count += 1 if zero_count == n*n: return "0" elif zero_c..

백준 2630 - 색종이 만들기

처음 든 생각 - 정사각형이 성립하는지 안하는지 판단한 다음 - 정사각형이 만들어지지 않는다면 다시 4개로 쪼개서 확인한다. - 크기가 1인 정사각형일 때가 재귀 탈출 조건일 것이다. 나의 답 import sys input = sys.stdin.readline N = int(input()) arr = [] for _ in range(N): arr.append(list(map(int,input().split()))) blue = 0 white = 0 # 사각형 별 시작 좌표 + 크기 를 받아서 def search(sr, sc, n): global blue, white # 1의 갯수를 센다 blue_count = 0 for i in range(sr,sr + n): for j in range(sc,sc+n):..

백준 24511 - queuestack

처음 든 생각 - 흠 이게 뭔 소리지 -> 종이에 하나씩 차근차근 써가면서 읽어보니 이해됐다. - 아 결국 큐에 있는 애들만 원소를 바꿔치기 하면 되겠구나 나의 답 import sys from collections import deque input = sys.stdin.readline N = int(input()) isStack = list(map(int, input().split())) arr = list(map(int, input().split())) M = int(input()) new = list(map(int, input().split())) q = deque() for i in range(N): if isStack[i] == 0: q.append(arr[i]) q.reverse() result..

728x90