Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- atcoder
- atcoder beginner contest
- 코테
- contest395
- 아픈 동물 찾기
- 집계함수
- PS
- cp초보
- 경쟁적프로그래밍
- PCSQL
- SQL문제
- 파이썬
- ABC
- cp
- MIN
- contest397
- SQL
- Python
- 프로그래머스
- pasql
- 코딩테스트
- 어린 동물 찾기
- 프로그래밍대회
Archives
- Today
- Total
노아
[20250215]Atcoder Beginner Contest 393 본문
점수: 600 [3 / 7]
등수: 6987 / 10700
문제별 풀이
A - Poisonous Oyster
from collections import deque
import sys, itertools, math, heapq
ip, op = sys.stdin, sys.stdout
ret = {"sick fine": 2, "sick sick": 1, "fine sick": 3, "fine fine": 4}
op.write(f"{ret[ip.readline().rstrip()]}\n")
- 문제요약: 입력 받는 문자열의 종류에 따라 알맞은 숫자를 출력
- 의도: 매우 간단한 경우의 상황을 조건에 따라 해결이 가능한가?
- 접근 방법: 딕셔너리를 이용해 문자열에 대한 값을 가져오는 아이디어를 사용
- 다른풀이: 일반 if문을 사용한 조건 처리
- 개선점: 입력이 적을 때는 input() 함수 사용
B - A..B..C
from collections import deque
import sys, itertools, math, heapq
ip, op = sys.stdin, sys.stdout
S = ip.readline().rstrip()
n, ret = len(S), 0
for i in range(1, n//2+1):
for j in range(n - (3 + (i-1)*2) +1):
if S[j] == 'A' and S[j + i] == 'B' and S[j + 2*i] == 'C':
ret += 1
op.write(f'{ret}\n')
- 문제요약:문자열에서 일정한 간격으로 A-B-C가 성립하는 인덱스 모음의 갯수 세기
- 의도: 조건에 맞게 반복문을 변형하여 사용가능한가 혹은 완전탐색으로 생각 가능한가
- 접근 방법:
- 일정한 간격의 3문자 이므로 간격의 길이가 문자열 길이의 반보다 클 수 없는 것을 이용하여 경우의 수를 줄이고
- 3 문자의 간격의 길이에 따라 조건을 맞춰 주어 반복문을 변형하여 푼다
- 다른풀이: (i,j,k) 세 인덱스의 모음을 완전탐색하여 풀 수 있다.
- 개선점: 입력이 적을 때는 input() 함수 사용
- 시간복잡도: O(n^2)
C - Make it Simple
from collections import deque
import sys, itertools, math, heapq
ip, op = sys.stdin, sys.stdout
n, m = map(int, ip.readline().split())
graph = [set() for _ in range(n+1)]
ret = 0
for _ in range(m):
a, b = map(int, ip.readline().split())
if a == b or b in graph[a]:
ret += 1
continue
graph[a].add(b)
cnt = 0
for a in range(1, n + 1):
for b in list(graph[a]):
if a in graph[b]:
cnt += 1
op.write(f'{ret + cnt//2}\n')
- 문제요약: 자기자신으로 돌아오는 간선과 다중 간선 제거하기
- 의도: 그래프를 구현하고 조건에 맞는 처리가 가능한가?
- 접근 방법:
- u == v인 경우 갯수 세주는 변수에 +1 해주기
- 모든 정점을 돌면서 다중간선있는지 확인하기
- 다른풀이:
다중간선 확인할 때 u->v의 방향을 통일 시켜 중복되는 것만 세주는 방법으로 이후의 따로 그래프를 도는 로직제거 가능. - 개선점: 그래프에서 중복을 체크할 때 가중치가 같으면 방향을 바꾸는 아이디어 생각하기
- 시간복잡도: O(n+m)
D - Swap to Gather
Can't Solve
E - GCD of Subset
Can't Solve
F - Prefix LIS Query
Can't Solve
피드백 & 회고
- 잘한점
- cp 처음으로 시도를 했다
- 앞으로 채워나갈 부분 확인
- 아쉬운점
- 문제를 해석하는 시간이 많이 걸렸다
- 대회 코드작성 환경을 기존과 다른 부분이 있어 시간 소모가 많았다.
- 다음 목표
- D 난이도 공략을 위해 낮은 문제 구현 전략 설정하기
- D 난이도의 문제를 풀기 위해 백준 골드 난이도 문제 풀기
[현재: 그레이, 목표: 브라운, 제한시간: 2025년 3월 14일]
'알고리즘 > CP' 카테고리의 다른 글
[20250315] Atcoder Beginner Contest 397 (0) | 2025.03.17 |
---|---|
[20250308] Atcoder Beginner Contest 396 (0) | 2025.03.11 |
[20250301]Atcoder Beginner Contest 395 (0) | 2025.03.10 |