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

[백준] 9663 N-Queen 파이썬 풀이 (백트래킹)

백준 문제 N*N 체스판에 퀸 N개를 놓는다 퀸의 좌우상하 대각선에 다른 퀸이 없어야한다. 그렇게 N개를 놓는 경우의 수를 출력하라 문제 풀이 맨 위에 줄 1번째 칸부터 확인한다 두번째 줄에 되는 칸이 있으면 세번째 줄로 내려간다 세번째 줄에 되는 칸이 없다 그럼 다시 두번째 줄로 올라간다 두번째 줄로 올라가서 다음칸을 확인한다 세번째 줄로 가서 되는 칸이 있는지 확인한다 네번째 줄로 가서 되는 칸이 있는지 확인한다 없다 그럼 1번째 줄 두번째 칸으로 올라간다 1번째 줄 두번째 칸을 확인한다 두번째 줄에서 되는 칸이 있는지 확인한다 세번째 줄에 되는 칸이 있는지 확인한다 네번쨰 칸에 되는 칸이 있는지 확인한다 있으면 횟수를 하나 올린다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1..

[백준] 15650 N과 M(2) 파이썬 풀이 (백트래킹)

백준 문제 1~N까지 자연수 중에서 중복없이 M개를 고른 수열 고른 수열은 오름차순이어야한다. 문제 풀이 해를 찾는 도중 해가 아니어서 막히면, 되돌아가서 다시 해를 찾아가는 기법을 말합니다. 최적화 문제와 결정 문제를 푸는 방법이 됩니다. 어떤 노드의 유망성 점검 후 , 유망하지 않으면 그 노드의 부모 노드로 되돌아간 후 다른 자손 노드를 검색 1부터 시작해서 그 숫자와 다음 숫자를 배열에 넣고 , 배열의 길이가 m이 되면 print하고 맨 뒤의 숫자를 pop한다. 그 다음 숫자를 배열에 넣고 배열의 길이가 m이 되면 print하고 맨 뒤의 숫자를 pop한다 ... 코드 n,m = list(map(int,input().split())) #1234 2 s = [] def dfs(start): #start..

[백준] 2630 색종이 만들기 파이썬 (분할정복)

문제 정사각형 색종이 한 칸에 1이나 0으로 모두 채워져있지 않으면 4등분 한다 문제 풀이 처음 입력 받은 값을 color_paper에 2차원 리스트로 저장한다. 맨 처음 [0][0] 원소를 check라고 두고 색종이를 다 돌면서 check와 같지 않은 부분이 있는 지 확인한다. 같지 않은 원소가 나타난 즉시 4등분한다 if문에 안걸리고 4등분을 안하게 되면 그 check가 1인지 0인지 확인하고 white와 blue에 맞게 +1을 한다. 코드 import sys n=int(sys.stdin.readline()) color_paper=[list(map(int,sys.stdin.readline().split())) for _ in range(n)]#x행 y열 white=0#0이면 흰생 blue=0#1이면 ..

[백준] 2108 통계학 파이썬 풀이 (정렬)

백준 문제풀이 입력받은 숫자들을 리스트에 저장하고 크기 순서대로 정렬을 해주었다. (중앙값을 구하기 위해) 산술 평균: sum을 len으로 나누고 반올림했다. 중앙값: len의 나누기2의 위치에 있는 값을 출력한다. 최빈값: Counter사용 Counter(num_list).most_common() 메소드는 num_list에서 가장 많이 들어있는 순서대로 dict형태로 출력한다. 예를 들어 num_list가 [1,1,1,2,2,3]이면 { 1:3 , 2:2, 3:1} 이렇게 출력한다. 여기서는 가장 많이 들어있는 것이 두개넘는지만 보면 되기때문에 2개까지 확인한다. 첫번째 나온 빈도와 두번째 나온 빈도가 같으면 최빈값 중에서 두번째로 작은 값( mode[1][0])을 출력한다 범위 : 마지막 숫자와 맨 ..

[백준] 1149 RGB거리 파이썬 풀이(동적 계획법)

백준 문제 n번째 집은 그 앞의 집과 색이 같으면 안된다. 그 뒤에 집이랑도 색이 같으면 안된다. 풀이 집의 개수가 주어지고 집마다 빨강, 초록, 파랑으로 칠할때의 값이 주어지는 것을 리스트로 만든다. 1번째 집이 빨간색으로 칠하는 비용은 p[0][0]이고 2번째 집이 파랑색으로 칠하는 비용은 p[1][2] 이런식으로 집이 한개만 있을때는 p[0][0] p[0][1] p[0][2] 중에서 가장 작은 것을 구하면 된다. 집이 두개 이상일때는 지금 집이 빨강일때 -> 전 집을 파랑으로 칠한것 or 초록으로 칠한 것 중에서 비용을 더한 것이 가장 작을때를 p[i][0]에 저장한다 지금 집이 초록일때, 파랑일때도 마찬가지로 계산하여 p[i][0] p[i][1] p[i][2] 에 저장하고 그 중에서 가장 작은 값..

[백준] 9461 파도반 수열 파이썬 풀이 (동적 계획법)

백준 문제 파도반 수열은 1 1 1 2 2 3 4 5 7 9 12 ... 이다 4번째 수인 2부터 보면 2번째 수와 1번째 수를 더한 값이다. 6번째 수인 3은 4번째 수인 2와 3번째 수인 1을 더한 값이다. n번째 수는 n-2번째 수와 n-3번째 수를 더 한 값이다. 풀이 N은 100까지밖에 안되므로 미리 구해놓자 dp 배열을 100인덱스까지 만들어놓고 1 2 3 번째는 1로 초기화. 4번째 부터 위에서 말한 규칙을 적용하여 dp배열을 미리 만들어 놓음 코드 num = int(input()) dp = [0 for i in range(101)] dp[1] = 1 dp[2] = 1 dp[3] = 1 for i in range(4,101): dp[i] = dp[i-2] + dp[i-3] for _ in r..

[백준] 11866 요세푸스 문제 0 파이썬 풀이 (큐, 덱)

코드 from collections import deque n, k = map(int, input().split()) stack = deque([i for i in range(1, n+1)]) print("") 풀이 원래 이해가 안됐던 점은 만약에 7 7 이 입력되면 7번째 사람이 죽고 6명 남으면 어떡하지? 라고 생각했는데 그러면 계속 돌면서 7번째 사람을 죽이는 것이다 예를 들어 1 2 3 4 5 6 사람이 있으면 여기서 7번째는 1번이다 stack에 1부터 n번호까지 사람을 넣고 k번째 사람이 맨 왼쪽에 올때까지 stack에 맨 앞에 원소를 꺼내서 맨 뒤에 넣는다 7명이고 3번째 사람을 죽인다고 치면 1 2 3 4 5 6 7 에서 2 3 4 5 6 7 1 을 만들고 3 4 5 6 7 1 2 를 만들..

[백준] 2667 단지 번호 붙이기 파이썬 풀이 (DFS, BFS)

코드 import sys dx=[-1,0,1,0] dy=[0,1,0,-1] n=int(sys.stdin.readline()) a=[list(sys.stdin.readline()) for _ in range(n)] print(a) cnt=0 apt=[] def dfs(x,y): global cnt a[x][y] = '0' #방문한 곳은 0으로 바꾼다. cnt+=1 for i in range(4): nx = x + dx[i] #설명 ny = y + dy[i] if nx = n or ny =n: continue if a[nx][ny] == '1': dfs(nx,ny) for i in range(n): for j in range(n): if a[i][j] == '1': c..