Featured image of post ABC 300: A, C, D

ABC 300: A, C, D

AtCoder Beginner Contest 300 : A, C, D 풀이

A - N-choice question

https://atcoder.jp/contests/abc300/tasks/abc300_a

문제

첫째 줄에 배열의 길이 $N$과 두 수 $A$와 $B$가 주어진다. 둘째 줄에 배열이 주어진다.

설명

배열 중에서 $A+B$와 일치하는 것의 인덱스를 출력한다.

소스 코드

1
2
3
4
5
6
import sys
input = sys.stdin.readline
 
n, a, b = map(int, input().split())
arr = [int(x) for x in input().split()]
print(arr.index(a+b)+1)

C - Cross

https://atcoder.jp/contests/abc300/tasks/abc300_c

문제

첫째 줄에 배열의 높이 $H$와 너비 $W$가 주어진다. 둘째 줄부터 $1+H$ 번째 줄까지 배열이 주어진다.

‘#‘이 크로스하는 경우를 세 주면 되는데, 사이즈별로 개수를 세 주어야 한다.

1
2
3
4
5
#...#
.#.#.
..#..
.#.#.
#...#

위 경우는 사이즈가 2인 것이다.

사이즈가 $1$인 개수부터 사이즈가 $N$인 개수까지 출력하면 된다. 여기서 $N$은 $min(H,W)$이다.

해설

중심점을 먼저 찾으면 되는데, 모든 중심점은 두 가지 조건을 만족한다.

  1. 모든 크로스의 중심점은 아래 에시의 형태이다.
1
2
3
#.#
.#.
#.#
  1. 모든 중심점의 좌표값은 다음 범위 내에 있다. $1 \leq R \leq H-2$ $1 \leq C \leq W-2$

이걸로 중심점을 한 개씩 잡고, 1씩 크기를 늘려가면서 체크해주면 된다.

소스 코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
input = sys.stdin.readline


def check(x, y):
    i = 1
    while True:
        for dx, dy in zip([i, i, -i, -i], [i, -i, i, -i]):
            nx, ny = x + dx, y + dy
            if not nx in range(w) or not ny in range(h):
                return i-2
            if arr[ny][nx] != '#':
                return i-2
        i += 1


h, w = map(int, input().split())
arr = [input().rstrip() for _ in range(h)]
result = [0 for _ in range(min(h, w))]
for y in range(1, h-1):
    for x in range(1, w-1):
        if arr[y][x] == arr[y-1][x-1] == arr[y-1][x+1] == arr[y+1][x-1] == arr[y+1][x+1] == '#':
            result[check(x, y)] += 1
print(*result)

D - AABCC

https://atcoder.jp/contests/abc300/tasks/abc300_d

문제

첫째 줄에 $N$이 주어진다. $(3 \leq N \leq 10^{12})$

$N$보다 크지 않은 양의 정수 중에서, $a^2\times b\times c^2$ 로 표현될 수 있는 수의 개수를 출력한다. $(a<b<c)$ 이며, $a, b,c$는 소수이다.

해설

재미있는 문제였다.

$\sqrt{N}$까지 소수를 구하고, $a<b<c$가 되도록 세 가지 소수를 선택해 조건을 만족하는지 개수를 세 주면 된다.

커팅 없이 돌리면 시간 초과가 나고, 두 가지 커팅을 해 주어야 한다.

  1. $b < c$ 이므로 $a^2 \times b^3$이 $N$ 보다 크다면 $a^2\times b\times c^2 \leq N$을 만족할 수 없으므로, 그 뒤는 확인하지 않아도 된다.

  2. $a^2\times b\times c^2$ 가 $N$보다 크다면, 마찬가지로 그 뒤는 확인하지 않아도 된다.

소스 코드

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
from math import *
input = sys.stdin.readline


def eratosthenes(n):
    primes = [True] * (n + 1)
    p = 2
    while p * p <= n:
        if primes[p]:
            for i in range(p * p, n + 1, p):
                primes[i] = False
        p += 1
    primes_list = []
    for p in range(2, n):
        if primes[p]:
            primes_list.append(p)
    return primes_list


n = int(input())
primes = eratosthenes(floor(sqrt(n)))
l = len(primes)
count = 0
for i in range(l):
    for j in range(i+1, l):
        a, b = primes[i], primes[j]
        if a*a*b*b*b > n:
            break
        for k in range(j+1, l):
            a, b, c = primes[i], primes[j], primes[k]
            if a*a*b*c*c <= n:
                count += 1
            else:
                break
print(count)