코딩 테스트/백준
[Python] 백준 20125 쿠키의 신체 측정
위시리
2025. 1. 7. 15:44
문제 분석
- 각 변의 길이가 n인 정사각형
- 쿠키의 신체는 머리, 심장, 허리, 좌우 팔, 다리
- 빨간 곳은 심장
- 머리 : 심장 바로 위 1칸
- 팔 : 심장으로 좌우 양쪽
- 허리 : 심장 바로 아래
- 각 다리는 허리 대각선 아래
- 왼쪽 팔, 오른쪽 팔, 허리, 왼쪽 다리, 오른쪽 다리의 길이를 공백을 구분하여 출력
코드 설계
- 가장 먼저 찾아지는게 머리 (x, y+1)
- 머리 바로 아래 (x, y)가 심장
- 현재 위치로 부터 왼쪽으로 이동하는데 '-'가 나오면 멈춤
정답 코드
좌표를 헷갈려서 좀 걸렸지만.. 통과
import sys
input = sys.stdin.readline
n = int(input())
g = []
for _ in range(n) :
g.append(list(input()))
heart = ''
for i in range(n) :
for j in range(n) :
if g[i][j] == "*" :
heart = (i+1,j)
break
if len(heart) != 0 :
break
body = []
h,w = heart
def find_left_arm(h, w) :
cnt = -1 # 처음은 심장
while w >= 0 :
if g[h][w] == "_" :
return cnt
else :
w-= 1
cnt += 1
return cnt
def find_right_arm(h, w):
cnt = -1
while w < n :
if g[h][w] == '_' :
return cnt
else :
w += 1
cnt += 1
return cnt
def find_back(h, w) :
cnt = -1 # 심장에서 시작
while h < n :
if g[h][w] == '_' :
return cnt
else :
cnt += 1
h += 1
return cnt
def find_leg(h, w) :
cnt = 0
while h < n :
if g[h][w] == '_' :
return cnt
else :
cnt += 1
h += 1
return cnt
print(h+1,w+1) # 좌표가 1부터 시작
body.append(find_left_arm(h,w))
body.append(find_right_arm(h,w))
body.append(find_back(h,w))
back = body[-1]
body.append(find_leg(h+back+1, w-1))
body.append(find_leg(h+back+1, w+1))
print(' '.join(map(str, body)))
다른 사람 코드 1
import sys
input=sys.stdin.readline
N = int(input()) # 판 크기
board = []
# 입력
for _ in range(N) :
board.append(list(input().rstrip()))
# 머리를 통해 심장 찾기
sign = False
x = 0
y = 0
for i in range(N) :
for j in range(N) :
if board[i][j] == '*' :
x = i+2
y = j+1
print(x,y)
sign = True
break
if sign :
break
# 왼팔 검사
left_arm = 0
for i in range(y-1) :
if board[x-1][i] == '*' : left_arm += 1
# 오른팔 검사
right_arm = 0
for i in range(y, N) :
if board[x-1][i] == "*" : right_arm += 1
# 허리 검사
back = 0
line = 0 # 허리 끝
for i in range(x, N) :
if board[i][y-1] == "*" :
back += 1
line = i
# 왼쪽 다리 검사
# 밑에서부터 허리 끝까지 *이 있으면 갯수 세기
left_leg = 0
for i in range(N-1, line, -1) :
if board[i][y-2] == '*' : left_leg += 1
# 오른쪽 다리 검사
right_leg = 0
# 밑에서부터 허리 끝까지 *이 있으면 갯수 세기
for i in range(N-1, line, -1) :
if board[i][y] == '*' : right_leg += 1
print(left_arm, right_arm, back, left_leg, right_leg)