AtCoder
AtCoder Beginner Contest 241 후기
PeiSea
2022. 2. 27. 18:52
인덱스 배열이 주어지고, 초기 인덱스가 0일 때 문제의 규칙에 따라 2번 이동 시 마지막 인덱스를 묻는 문제. 단순 구현
import sys
arr = list(map(int, sys.stdin.readline().split()))
now = 0
for i in range(2):
now = arr[now]
print(arr[now])
B. Pasta
먹을 수 있는 파스타의 면 길이가 주어지고, 먹고 싶은 파스타 면 길이가 주어질 때 모든 먹고 싶은 파스타를 먹을 수 있는지 체크하는 문제. dictionary를 적절히 쓰면 되는 쉬운 문제다
import sys
n , m = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
b = list(map(int, sys.stdin.readline().split()))
res = dict().fromkeys(a, 0)
for i in a:
res[i] += 1
for i in b:
if i not in res:
print('No')
sys.exit(0)
if res[i] <= 0:
print('No')
sys.exit(0)
res[i] -= 1
print('Yes')
C. Connect 6
초반에 문제 이해를 제대로 하지 못해서 번역기를 썼지만 그마저도 이해를 못해서 시간을 날린 문제다. 어이없게도 그냥 2개의 격자를 바꿔서 육목을 만들 수 있는지 없는지 확인하는 브루트 포스이다.
import sys
# check : 현재 격자가 (x,y)에 위치해있고 각각이 a, b만큼 움직일 때 육목을 만들수 있는지 없는지를 리턴하는 함수
def check(x, y, a, b):
white, black = 0, 0
cnt = 1
# 이동해도 범위에 있고 아직 6개를 조사하지 않을 때만 반복
while 0 <= x + a < n and 0 <= y + b < n and cnt < 6:
# 색깔별 판독
if arr[x][y] == '.':
white += 1
else:
black += 1
# 갯수 증가 및 위치 이동
cnt += 1
x += a
y += b
# 마지막 격자 확인
if 0 <= x < n and 0 <= y < n:
if arr[x][y] == '.':
white += 1
else:
black += 1
# 만약 6개를 구성하지 못하는 경우는 육목이 안됨
if cnt < 6:
return False
# 바꿀 수 있는 격자가 2개 이하이기 때문에 2개 초과면 육목을 만들 수 없음
if white > 2:
return False
return True
# 입력부
n = int(sys.stdin.readline())
arr = [list(sys.stdin.readline().rstrip()) for _ in range(n)]
dx = [1, 0, 1, 1]
dy = [0, 1, -1, 1]
# 모든 격자 돌면서 확인
for i in range(n):
for j in range(n):
for k in range(4):
if check(i, j, dx[k], dy[k]):
print('Yes')
sys.exit(0)
print('No')
총평 : D번도 못풀어보고 망한 대회.... 파이썬보다는 c++로 푸는게 나은 문제인데 고집부리다가 시간 말아먹은게 아쉬웠음. C만 풀어서 레이팅 떡락을 예상했으나 생각보다 다른 사람들도 많이 D를 못풀어서 의문의 레이팅 상승. 그래도 내적 기준으로 D까지는 꼭 풀자고 했는데 못풀어서 마냥 기뻐할 수 없을듯. 우테코로 바쁘니 제때 업솔빙 해야겠다.