Computer Science/Algorithm 97

BOJ 1931: 회의실 배정 [Python 3]

https://www.acmicpc.net/problem/1931 1931번: 회의실 배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 한 회의실을 사용하기 위해서 제일 많이 회의를 할 수 있는 방법을 찾는다. import sys input=sys.stdin.readline n=int(input()) data=[list(map(int,input().split())) for _ in range(n)] data.sort(key=lambda x:[x[1],x[0]]) start,end=data[0] cnt=1 for i in range(1,n): start1,end1=data[i] if end

BOJ 2293: 동전 1 [Python 3]

평범한 dynamic programming 문제이다. n,k=map(int,input().split()) coindata=[] for _ in range(n): coindata.append(int(input())) coindata.sort() values=[0 for _ in range(k+1)] values[0]=1 for i in coindata: for j in range(1,k+1): if j-i>=0: values[j]+=values[j-i] print(values[k]) 0원부터 k원까지 개수를 셀 수 있는 리스트를 만들고, 거기에 1월부터 k원까지 가능한 개수를 모두 센다. 반복문에서, 현재 돈의 크기에 (현재 돈 - 동전의 크기)일 때의 개수를 더해준다.

BOJ 9466: 텀 프로젝트 [Python 3]

골드 3 난이도의 텀 프로젝트라는 문제를 풀어보았다. 문제를 해석해보자면, 서로서로 프로젝트를 같이 하고 싶은 학생들끼리 그룹을 짜주려고 하는데, 4번이 7번, 7번이 6번 6번이 4번, 즉 서로서로를 꼬리잡기 하듯이 고르면 같은 그룹에 넣어주는 구조이다. 만약 자기 자신을 고르면, 혼자 팀이 된다. (현실 반영...) 내용 자체는 쉽지만 구현하기가 어려웠다. 코드이다. t=int(input()) for _ in range(t): n=int(input()) data=[0]+list(map(int,input().split())) visited=[False for _ in range(n+1)] res=0 for i in range(1,n+1): if visited[i]: continue num=i q=[nu..

BOJ 1644: 소수의 연속합 [Python 3]

이번에는 소수의 연속합이라는 골드 3 난이도의 문제를 풀어 보았다. 소수판별을 이용하면 쉽게 풀 수 있는 문제이다. 그러나, 두 개의 포인터, 한 마디로 기준을 두 개를 잡고 풀어야 하는 문제여서 독특했다. n=5*10**6 a=[False,False]+[True]*(n-1) for i in range(2,n+1): if a[i]: for j in range(2*i,n+1,i): a[j]=False primes=[] for i in range(n): if a[i]: primes.append(i) n=int(input() ) l,r=0,0 answer=0 while n>=primes[r]: sumNum=sum(primes[l:r+1]) if sumNum>n: l+=1 elif sumNum

BOJ 10951: A+B -4 [Python 3]

해당 문제는 더하기 연산을 하면 되는 단순한 문제처럼 보인다. 하지만, 이 문제의 포인트는 처음에 몇개의 연산을 해야하는지, 제한을 주지 않았다. 그렇기에, input의 끝, EOF 까지 input을 받아야한다. import sys lines=sys.stdin.readlines() for line in lines: A,B=map(int,line.split()) print(A+B) #================ while True: try: a,b=map(int,input().split()) print(a,b) except EOFError: break 두 가지 방법으로 해당 문제를 해결 할 수 있다. lines에서 모든 줄의 input을 받는 거다. 이 때 사용하는 함수가 sys.stdin 모듈의 rea..

BOJ 15711: 환상의 짝꿍 [Python 3]

문제가 단순히 소수를 판단하는 문제인 줄 알았는데, 극악의 정답률을 자랑하는 데에는 이유가 있다. t=int(input()) data=[] for _ in range(t): data.append(list(map(int,input().split()))) num=0 primes=[] for i in data: num=max(sum(i),num) a=[False,False]+[True]*(num-1) for i in range(2,int(num**0.5)+1): if a[i]: primes.append(i) for j in range(2*i,num+1,i): a[j]=False for i in range(len(a)): if a[i]: primes.append(i) for i in data: limit=sum..

BOJ 2206: 벽 부수고 이동하기 [Python 3]

오늘의 문제는 BOJ 2206, 벽 부수고 이동하기이다. 문제 내용은 단순히 bfs를 이용하면 될 것 같지만, 이동하면서 벽을 한 번 깰 수 있다는 조건이 있어서 기존의 방식으로 접근할 수 없었다. from collections import deque m,n= map(int,input().split()) data=[[1e10]*n] for i in range(m): data.append([1e10]+list(map(int,list(input())))) visited=[[[0,0] for _ in range(n+1)] for _ in range(m+1)] q=deque() q.append([1,1,0]) visited[1][1]=[1,1] dx=[[0,1],[0,-1],[1,0],[-1,0]] def bf..

BOJ 1654: 랜선 자르기 [Python 3]

오늘의 문제는 랜선 자르기이다. 이 문제의 특징은, 랜선의 길이가 2의 31제곱-1까지 커질 수 있기 때문에, for문을 1부터 2의 31제곱-1까지 돌리면 시간 초과가 발생한다. 그렇기에 다른 방법을 사용해야 하는데, 이분 탐색을 통해 구현해보았다. 정답 코드이다. k,n=map(int,input().split()) data=[] for _ in range(k): data.append(int(input())) data.sort() minNum=1 maxNum=max(data) while minNum=n: minNum=mid+1 else: maxNum=mid-1 print(maxNum) 먼저 값들을 input 받고, 1부터 input 중 제일 큰 값 사이에 mid를 둔다. 이제 그 mid로 data에 있..

BOJ 2661: 좋은수열 [Python 3]

오늘의 문제는 백트래킹 및 dfs를 이용한 문제인 좋은수열이다. def goodCheck(arr): for i in range(1,len(arr)//2+1): if arr[len(arr)-i:len(arr)]==arr[len(arr)-2*i:len(arr)-i]: return False return True def dfs(arr,idx): if idx==n: print(''.join(str(i) for i in arr)) exit() for i in range(1,4): if goodCheck(arr+[i]): arr.append(i) dfs(arr,idx+1) arr.pop() n=int(input()) dfs([],0) 직관적으로 문제를 풀면 된다. 1부터 3까지 넣어가면서, 해당 수열이 조건을 만족..