본문 바로가기

프로그래밍/백준

(14)
백준 9663 NQueen 파이썬으로 다양하게 풀어보기 1년에 한두번씩은 꼭 푸는 것 같은 NQueen 문제, 옛날 풀이부터 차근차근 한번 되짚어 보자, 기본적인 틀은 다 같다. 백트래킹을 사용하며, 한 행을 기준으로 백트래킹을 진행하며, 가능한 위치를 찾아 퀸을 배치한다. 0. 배치할 수 있는지 8방향 탐색해서 판별하는 경우배열에 퀸을 놓고, 현재 놓을 위치 기반으로 8방향을 탐색해서(6방향만 탐색해도 문제 없다, 왜냐하면 한 행에는 하나의 퀸만 놓을 수 있기 때문에) 퀸이 존재한다면 불가능할 것이고, 퀸이 존재하지 않는다면 가능할 것이다.노란색이 이미 배치된 퀸이고, 주황색에 배치가능한지 판별하려 했을 때 저 8방향을 모두 탐색해서 다른 퀸이 존재하는지 아닌지 판별한다.존재한다면 넘어갈 것이고, 존재하지 않는다면 배치할 것이다.불필요한 탐색이 굉장히 많다..
[백준/C++] 10216, 12004 10216 Count Circle Groups 문제난이도 : G4 알고리즘 : 분리집합  풀이좌표 x,y와 반지름 R이 주어진다. 원이 겹치는 부분끼리 그룹을 지어주고 최종적으로 남은 그룹의 개수를 출력해주면 된다.float를 최대한 피하는게 좋으므로 거리를 구할때 x1,y1,r1과 x2,y2,r2가 있을 때 (x1-x2)^2+(y1-y2)^2와 (r1+r2)^2를 비교해주면 된다. #include #include #include #include using namespace std;int par[3001];int find(int x){ if (x == par[x]) return x; par[x] = find(par[x]); return par[x];}void uni(int a,int b){ a = fin..
백준 20157 - 화살을 쏘자! (파이썬) 난이도 골드 5 유형 수학 브루트 포스 해시맵 해결 실수형의 값을 이용하지 말고 분수꼴로 넣어주면 해결할 수 있다. gcd를 이용하여 기약분수 꼴로 해시맵에 저장해 준 뒤 가장 큰 값을 출력해주면 된다. 코드 from sys import stdin from collections import defaultdict from math import gcd input=stdin.readline def gettilt(x,y): if x==0: if y>0: return '위' return '아래' if y==0: if x>0: return '오른쪽' return '왼쪽' div=gcd(x,y) return (x//div,y//div) n=int(input()) arr=[map(int,input().split()) ..
백준 1824 - 도미노 (파이썬) 난이도 플래티넘 3 유형 이분 매칭 해결 아이디어를 떠올리기까지 한참 걸렸다. 비숍 문제와 같이 흑백으로 생각하고 이분매칭을 이용해주면 풀린다. 코드 from sys import stdin from collections import defaultdict input=stdin.readline def dfs(x): if vi[x]: return False vi[x]=True for i in able[x]: if placed[i]==0 or dfs(placed[i]): vi[i]=True placed[i]=x return True return False n,m=map(int,input().split()) able=[[] for i in range(n*m+1)] arr=[[m*j+i for i in range(..
백준 1806 - 부분합 (파이썬) 난이도 골드 4 유형 두 포인터 해결 간단한 두 포인터 문제이다. s보다 구간 합이 작으면 r을 증가, 반대면 l을 증가시켜주면 된다. 코드 from sys import stdin input=stdin.readline n,s=map(int,input().split()) arr=[*map(int,input().split())] l=0 r=0 total=0 ans=100001 while l
백준 14267 - 회사 문화 1 (파이썬) 난이도 골드 4 유형 그래프 탐색 - dfs 트리 - Ternary tree 다이나믹 프로그래밍 트리에서의 다이나믹 프로그래밍 해결 사장으로부터 내려가면서 칭찬받은 수치를 같이 내려주면 된다. 루트가 정해져있고 상하관계가 확실해서 방문처리를 사용할 필요가 없었다. n이 m보다 크다는 보장이 없으므로 한 사람이 여러번 칭찬을 받을 수도 있다. 코드 from sys import stdin,setrecursionlimit from collections import defaultdict input=stdin.readline setrecursionlimit(100000) n,m=map(int,input().split()) level=[*map(int,input().split())] tree={i:defaultdi..
백준 15681 - 트리와 쿼리 (파이썬) 난이도 골드 5 유형 트리에서의 다이나믹 프로그래밍 DFS 해결 트리DP는 처음 해보았지만 문제에서 뭔가 느낌이 왔다. DFS를 쓰고 방문처리를 해주면 될 것 같았다. dfs 사용시 메모리 초과와 재귀횟수 제한 설정에 유의해줘야 하는 문제였다. 코드 from sys import stdin,setrecursionlimit from collections import defaultdict input=stdin.readline setrecursionlimit(1000000) n,r,q=map(int,input().split()) tree=[[] for i in range(n+1)] #트리 dp=[1]*(n+1) # 정답 vi=[0]*(n+1) # 방문처리 for i in range(n-1): u,v=map(in..
백준 1240 - 노드 사이의 거리(파이썬) 난이도 골드 5 유형 그래프 탐색 트리 해결 간단하게 (n+1)의 제곱 크기의 배열로 구현 가능하다. 더 빠르게 풀고싶다면 딕셔너리를 이용해주면 된다. n의 크기도 그리 크지 않고 m의 크기도 그리 크지 않아서 m번의 요청이 들어올 때 마다 값을 저장하지 않고 탐색을 해 주어도 시간적으로 넉넉하다. dfs나 bfs나 다익스트라 중 자신이 편한 것을 이용해주면 된다. 거리가 10000이하의 정수 즉 0이나 음수가 들어갈 수도 있지만 구조가 트리 구조기 때문에 사이클이 형성되어 있지 않으므로 별로 상관 없다. 코드 배열 사용(느림) from sys import stdin from collections import deque from math import inf input=stdin.readline n,m=m..
백준 9934 - 완전이진트리 (파이썬) 난이도 실버 1 유형 트리 - 순회 해결 트리의 각 순회의 특징을 잘 이해했다면 쉽게 풀 수있다. 주어지는 이동 순서는 꽉 찬 이진트리에서 중위순회를 한 결과와 똑같다. 그것을 토대로 구현해주면 된다. 코드 from sys import stdin input=stdin.readline k=int(input()) order=list(map(int,input().split())) line=[(len(order)//2,0,len(order))] while True: nextline=[] for i,mn,mx in line: print(order[i],end=' ') nextline.append(((i+mn)//2,mn,i)) nextline.append(((i+mx)//2,i,mx)) print() line=n..
백준 20950 - 미술가 미미 (파이썬) 난이도 실버 2 유형 백트래킹, 브루트 포스 해결 n줄에 걸쳐 RGB값 입력받음. 추가적으로 곰두리값 한줄을 더 입력받음 n개의 물감을 섞어(최소 2 최대 7) 만들 수 있는 물감 중 곰두리값과의 차이가 가장 작은 값 출력 더하고 나눈 값을 넘겨주면 안된다. (= 매번 소수점을 버리면 안되고 마지막에만 a//x + b//x + c//x 와 (a+b+c)//x는 항상 같지 않으므로) 이제 간단히 구현만 해주면 된다. 코드 from sys import stdin input=stdin.readline # n줄에 걸쳐 RGB값 입력받음. # 추가적으로 곰두리값 한줄을 더 입력받음 # n개의 물감을 섞어(최소 2 최대 7) 만들 수 있는 물감 중 # 곰두리값과의 차이가 가장 작은 값 출력 # 더하고 나눈 값을 넘..