백준 64

Baekjoon Online Judge 1874번 파이썬

문제 링크 https://www.acmicpc.net/problem/1874 1874번: 스택 수열 1부터 n까지에 수에 대해 차례로 [push, push, push, push, pop, pop, push, push, pop, push, push, pop, pop, pop, pop, pop] 연산을 수행하면 수열 [4, 3, 6, 8, 7, 5, 2, 1]을 얻을 수 있다. www.acmicpc.net 정답 코드 import sys n = int(sys.stdin.readline()) current = 1 stack = [0] answer = [] temp = True for i in range(n): target = int(sys.stdin.readline().strip()) while current

Baekjoon Online Judge 4256번 파이썬. 분할정복.

문제 링크 https://www.acmicpc.net/problem/4256 4256번: 트리 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 노드의 개수 n이 주어진다. (1 ≤ n ≤ 1,000) BT의 모든 노드에는 1부터 n까지 서로 다른 번호가 매겨져 있다. 다음 www.acmicpc.net 전위순회한 결과의 맨 앞 노드는 전체 트리의 루트이다. 중위순회한 결과에서 전체 트리의 루트를 기준으로 왼쪽은 왼쪽 서브트리이고, 오른쪽은 오른쪽 서브트리이다. 후위순회는 왼쪽, 오른쪽, 루트 순으로 출력하는 것이다. 그래서 전체 트리의 루트(root)를 기준으로 왼쪽 먼저 함수를 실행하고, 다음으로 오른쪽을 실행한다. 그리고 마지막에 root를 출력한다. 정답 코드 impo..

Baekjoon Online Judge 2448번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/2448 2448번: 별 찍기 - 11 첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수) www.acmicpc.net 빨간 부분과 주황 부분, 두개의 공간으로 나누어 풀었다. 정답 코드 import sys N = int(sys.stdin.readline()) def draw_stars(N): if N == 3: return [" * "," * * ","*****"] divide = draw_stars(N//2) stars = [] for d in divide: #빨간 공간 stars.append(' '*(N//2)+d+' '*(N//2)) for d in..

Baekjoon Online Judge 2447번 파이썬. 분할 정복.

문제 링크 https://www.acmicpc.net/problem/2447 2447번: 별 찍기 - 10 재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 www.acmicpc.net 빨간 부분을 상, 주황 부분을 중, 노란 부분을 하로 생각해서 3구간으로 나누어 풀었다. 정답 코드 import sys N = int(sys.stdin.readline()) def dnc(N): if N == 1: return ["*"] divide = dnc(N//3) stars = [] for d in divide: #상 stars.append(d*3) f..

Baekjoon Online Judge 11728번

문제 링크 https://www.acmicpc.net/problem/11728 11728번: 배열 합치기 첫째 줄에 배열 A의 크기 N, 배열 B의 크기 M이 주어진다. (1 ≤ N, M ≤ 1,000,000) 둘째 줄에는 배열 A의 내용이, 셋째 줄에는 배열 B의 내용이 주어진다. 배열에 들어있는 수는 절댓값이 109보다 작거 www.acmicpc.net 정답 코드 import sys n,m = map(int,sys.stdin.readline().split()) N = list(map(int,sys.stdin.readline().split())) M = list(map(int,sys.stdin.readline().split())) result = N + M result = sorted(result) p..

Baekjoon Online Judge 1744번. 그리디.

문제 링크 https://www.acmicpc.net/problem/1744 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net 정답 코드 import sys N = int(sys.stdin.readline()) positive = [] negative = [] result = 0 for i in range(N): num = int(input()) if num > 1: positive.append(num) elif num = len(positive): #같이 곱해질 짝이 없으면 더하기 result += posi..

Baekjoon Online Judge 11399번 파이썬. 그리디.

문제 링크 https://www.acmicpc.net/problem/11399 11399번: ATM 첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000) www.acmicpc.net 정답 코드 import sys N = int(sys.stdin.readline()) P = list(map(int,sys.stdin.readline().split())) P = sorted(P) min = 0 result = 0 for i in P: min += i result += min print(result)

Baekjoon Online Judge 1931번 파이썬. 그리디.

문제 링크 https://www.acmicpc.net/problem/1931 1931번: 회의실 배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 정답 코드 import sys N = int(sys.stdin.readline()) I = [] for i in range(N): I.append(list(map(int,sys.stdin.readline().split()))) I = sorted(I,key=lambda x:x[0]) #시작시간 기준 오름차순 정렬 I = sorted(I,key=lambda x:x[1]) #종료시간 기준 오름차순 정렬 last = 0 #회의가 끝나는 시간 count = 0 #회의 개수 세기 for i,j in I: if ..

Baekjoon Online Judge 1783번 파이썬. 그리디.

문제 링크 https://www.acmicpc.net/problem/1783 1783번: 병든 나이트 첫째 줄에 체스판의 세로 길이 N와 가로 길이 M이 주어진다. N과 M은 2,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net N = 1 이동할 수 없으므로 방문 할 수 있는 칸 수는 1. N = 2 위로 한 번,오른쪽 두번과 아래로 한 번, 오른쪽 두번. 이 두가지 이동패턴만 가능하다. 그런데, 4번 이상 이동하면 이동 패턴을 한번씩만 사용해야 한다. 그리고 이는 M의 길이에 따라 달라진다. M이 6보다 커질 때부터 이동 횟수가 4번이 되기 때문에 더 이상 이동할 수 없게 된다. 열의 크기 / 방문한 칸 수 M = 1 -> 1 M = 2 -> 1 M = 3 -> 2 M = ..

Baekjoon Online Judge 10610번 파이썬. 그리디.

문제 링크 https://www.acmicpc.net/problem/10610 10610번: 30 어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한 www.acmicpc.net 30의 배수가 되려면, 3의 배수이며, 1의 자리가 0이어야한다. 3의 배수가 되려면, 각 자리 수의 합이 3의 배수가 되어야 한다. 이를 만족시키고, 내림차순 정렬을 하면 30의 배수가 될 수 있는 가장 큰 수를 구할 수 있다. 정답 코드 N= list(map(int,input())) sum = 0 for i in N: sum += i if sum % 3 != 0 or 0 not in ..

728x90