https://www.acmicpc.net/problem/11916
코드
n = int(input())
base = [0]*4 # 0 ~ 2번째 원소는 각각 1루, 2루, 3루, 3번째 원소는 홈
ball_count = 0
answer = 0
def wild_pitch():
global answer
for i in range(2, -1, -1):
if base[i] == 1:
base[i+1] = 1
base[i] = 0
if base[3] == 1:
answer += 1
base[3] = 0
def ball_4():
global answer
if base[0] == 1:
if base[1] == 1:
if base[2] == 1:
answer += 1
base[2] = 0
base[2] = 1
base[1] = 0
base[1] = 1
base[0] = 0
base[0] = 1
for b in map(int, input().split()):
if b == 1: # 볼
ball_count += 1
elif b == 2: # 몸에 맞는 공
ball_count = 4
else: # 폭투
ball_count += 1
wild_pitch()
if ball_count >= 4:
ball_4()
ball_count = 0
print(answer)
설명
- `base`: 길이가 4인 1차원 배열이다. 각 원소는 순서대로 1루~3루, 그리고 홈을 뜻한다.
- `ball_count`: 현재 타자의 볼 카운트이다.
그리고 이동은 2가지 종류가 있다.
1. 볼넷일 때의 이동(`ball_4()`)
2. 폭투로 인한 이동(`wild_pitch()`)
ball_4()
def ball_4():
global answer
if base[0] == 1:
if base[1] == 1:
if base[2] == 1:
answer += 1
base[2] = 0
base[2] = 1
base[1] = 0
base[1] = 1
base[0] = 0
base[0] = 1
모두 자신을 포함해 앞의 주자들이 다 있어야만 진루할 수 있기 때문에 이런 중첩문의 구조를 갖게 되었다.
- 3루: 만루일 때 홈으로 들어가며 득점할 수 있다.
- 2루: 1, 2루가 모두 있어야 2루 주자가 3루로 진루할 수 있다.
- 1루: 1루 주자가 있어야 2루로 진루할 수 있다.
- 새로운 타자가 1루로 진출
wild_pitch()
def wild_pitch():
global answer
for i in range(2, -1, -1):
if base[i] == 1:
base[i+1] = 1
base[i] = 0
if base[3] == 1:
answer += 1
base[3] = 0
주자들이 무조건 진루를 하는 이동이기 때문에 크게 어려울 것은 없다. 다만, 앞쪽(1루 쪽)부터 진루 처리를 하면 뒷쪽의 데이터를 손상시킬 수 있기 때문에 3루부터 진루 처리를 해줘야 한다.
정말 단순한 구현 문제인데, 생각이 한 번 꼬이면 빙빙 돌아갈 수도 있는 문제라서 정신 잘 붙잡고 풀어야 한다....
'문제풀이 > 구현' 카테고리의 다른 글
| [Javascript/자바스크립트] (프로그래머스) 삼각 달팽이 (1) | 2025.05.25 |
|---|---|
| [Javascript/자바스크립트] (프로그래머스) 다단계 칫솔 판매 (1) | 2025.05.17 |
| [Javascript/자바스크립트] (프로그래머스) 베스트앨범 (0) | 2025.05.08 |
| [Python/파이썬] 백준 9555번 대회 장소 준비 (0) | 2025.04.22 |
| [Python/파이썬] 백준 11387번 님 무기가 좀 나쁘시네여 (0) | 2025.04.15 |