본문 바로가기

전체 글

(171)
[BOJ] [Python] 15649 : N과 M (1) 1부터 N까지 자연수 중에서 중복 없이 M개를 골라 수열을 만들면 된다. 핵심은 '중복 없이'이다. n, m = map(int, input().split()) li = [] dp = [0] * (n + 1) def back(cnt): if cnt == m: print(*li) return for i in range(1, n + 1): if dp[i] == 1: continue li.append(i) dp[i] = 1 back(cnt + 1) dp[li[-1]] = 0 li.pop() back(0) 백트래킹, 처음에는 어렵게 느껴졌는데 지금은 감을 좀 잡은 것 같다.
[BOJ] [Python] 11663번 : 선분 위의 점 예를 들어보자. (아래는 백준 예제 입력 1의 일부이다.) 5 1 1 3 10 20 30 1 9 현재 점의 위치는 1, 3, 10, 20, 30이다. 선분의 시작점은 1, 끝점은 9이다. 점의 위치 상에서 선분의 위치를 찾아줘야 한다. 점의 위치 상에서, 선분의 시작점은 선분의 시작점보다 크거나 같은 최솟값, 선분의 끝점은 선분의 끝점보다 작거나 같은 최댓값을 찾아주면 된다. 따라서 각각 1과 3이다. (전자는 tmp_s, 후자는 tmp_e) 여기서 주의할 점은 범위이다. 첫 번째 선분의 시작점이 점의 가장 앞의 위치보다 왼쪽에 있을 때. => tmp_s를 점의 가장 앞의 위치로 생각해주면 된다. 선분이 포함하는 최솟값이 가장 앞의 위치이기 때문이다. 두 번째 선분의 끝점이 점의 가장 끝 위치보다 오른쪽..
[BOJ] [Python] 10815번 : 숫자 카드 M개의 수에 대해서, 상근이가 가진 숫자 카드와 비교하는 문제이다. 중복되는 수가 있다면 1, 없다면 0이다. 순차 탐색으로 풀었다. n = int(input()) A = list(map(int, input().split())) A.sort() m = int(input()) tmp = list(map(int, input().split())) B = sorted(set(tmp)) idx = 0 result = {} for num in B: while True: if idx == n: result[num] = 0 break if num == A[idx]: result[num] = 1 break elif num < A[idx]: result[num] = 0 break else: idx += 1 for n in..