Algorithm/acmicpc.net 108

빡구현은 체력전이다. (#14503 로봇청소기)

#14503 로봇청소기 https://www.acmicpc.net/problem/14503 14503번: 로봇 청소기 첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$ 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽 www.acmicpc.net 고민도 필요없었다. 문제의 설명을 그대로 코드로 옮겼다. (말 그대로 구현) # 1. get input h, w = map(int, input().split()) # map size width - height x, y, d = map(int, input().split()) # start position, x, y, direc..

파이썬 시간초과는 논리도 필요해요. (#14888 연산자 끼워넣기)

#14888 연산자 끼워넣기 https://www.acmicpc.net/problem/14888 14888번: 연산자 끼워넣기 첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱 www.acmicpc.net 쉽다고 생각했다. 브루트포스 알고리즘을 사용해야하는 만큼 시간 초과가 마음에 걸렸지만 그래도 일단 해봤다. 시간초과 코드 import sys input = sys.stdin.readline num = int(input()) nums = [int(x) for x in input().split()] # +, -, ..

오랜만에 돌아온 알고리즘! 브루트포스 (#1062번 가르침)

오랜만에 백준 풀이로 돌아왔다. 이전에 백준을 풀었던 이유는, 소마에 합격하기 위해서였는데. 어느새 취준이 와버렸다.... 이젠 취업을 위해서 푸는 백준. 정말 내 인생이 걸린 백준이다. #1062번 가르침 https://www.acmicpc.net/problem/1062 1062번: 가르침 첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문 www.acmicpc.net 문제는 다소 복잡한 감이 있는데, anti로 시작하고 tica로 끝나는 단어가 N개 주어지면, K개의 알파벳을 추가로 학습하여 읽을 수 있는 단어의 최대 개수를 구하는 문제이다. 이 문..

분할 정복은 재귀인가? (#1629번 곱셈)

#1629번 곱셈 https://www.acmicpc.net/problem/1629 1629번: 곱셈 첫째 줄에 A, B, C가 빈 칸을 사이에 두고 순서대로 주어진다. A, B, C는 모두 2,147,483,647 이하의 자연수이다. www.acmicpc.net 거듭제곱을 해결하는 문제인데, 자료구조 수업에서 다룬 적이 있던 것 같다. 틀린 코드 from sys import stdin input = stdin.readline a, b, c = map(int, input().split()) def fpow(C, n): if n == 1: return C else: x = fpow(C, n//2) if n % 2 == 0: return x * x else: return x*x*C print(fpow(a, ..

처음보는 유형 (#5525번 IOIOI)

#5525번 IOIOI https://www.acmicpc.net/problem/5525 5525번: IOIOI N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN이 몇 www.acmicpc.net 일단 풀었다. 50점 짜리 코드 from sys import stdin input = stdin.readline p = "IOI" + "OI"*(int(input())-1) l = len(p) t = int(input()) target = input().strip() answer = 0 for i in ra..

DP는 아직 어렵.. (#17626 Four Squares)

#17626 Four Squares https://www.acmicpc.net/problem/17626 17626번: Four Squares 라그랑주는 1770년에 모든 자연수는 넷 혹은 그 이하의 제곱수의 합으로 표현할 수 있다고 증명하였다. 어떤 자연수는 복수의 방법으로 표현된다. 예를 들면, 26은 52과 12의 합이다; 또한 42 + 32 + 1 www.acmicpc.net DP 형태로 풀이하려다보니 잘 모르겠어서 검색했다. 풀이 과정은 이렇다. 문제에 따르면 모든 수는 4개 이하의 제곱수의 합으로 표현할 수 있다고 한다. j를 변수로 삼아 1 씩 키워나가며 j**2 과 목표값을 비교한다. dp[i-(j**2)] 부분에서는 목표값 i에서 j**2을 제외한 값의 dp값을 찾는다. 그러면 i-(j**..

가벼운 DP - 시간 복잡도를 고려한 (#9461번 파도반 수열)

#9461번 파도반 수열 https://www.acmicpc.net/problem/9461 9461번: 파도반 수열 오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 www.acmicpc.net 수열 문제인 만큼 단번에 DP임을 알아차렸다! 처음에는 주어지는 테스트 케이스를 모두 저장할 때, 정렬을 진행하면서 저장했다. 그리고 리스트 가장 오른쪽에 있는 수 (가장 큰 수)까지 dp 계산을 진행하고 각각의 케이스에 맞는 값을 출력했는데 시간초과가 났다. 그래서 단순히 최댓값을 별도의 변수에 추가로 저장하고 진행했더니 통과했다. 틀린 코드 with 정렬 (시간초과) n =..

술 마시고도 푸는 실버3 (#11047번 동전0)

#11047번 동전 0 https://www.acmicpc.net/problem/11047 11047번: 동전 0 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수) www.acmicpc.net 걍 짰는데 맞아서 당황했다. N, k = map(int, input().split()) money = [] for _ in range(N): x = int(input()) if x

시간복잡도는 완벽히 알고있는 듯 한. (#11659번 구간 합 구하기 4)

#11659번 구간 합 구하기 4 https://www.acmicpc.net/problem/11659 11659번: 구간 합 구하기 4 첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j www.acmicpc.net 어렵진 않았지만 시간초과가 나서 너무 짜증났던 문제 틀린코드 1 n, m = map(int, input().split()) nums = list(map(int, input().split())) for _ in range(m): i, j = map(int, input().split()) print(sum(nums[i-1:j])) 매 케이스 마..

애매한 차이. (#1780 종이의 개수)

#1780번 종이의 개수 https://www.acmicpc.net/problem/1780 1780번: 종이의 개수 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1 중 하나가 저장되어 있다. 우리는 이 행렬을 다음과 같은 규칙에 따라 적절한 크기로 자르려고 한다. 만약 종이가 모두 같은 수 www.acmicpc.net 평범한 분할정복 문제라고 생각하고 열심히 짰다. 틀린코드 N = int(input()) matrix = [list(map(int, input().split())) for _ in range(N)] answer = [0, 0, 0] # 0, 1, -1 def check(mat): pivot = None for r in mat: for c in r: if pivot..

728x90