코딩 테스트/백준

[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)