Velog에서 처음으로 쓰는 글이라 많이 어색하고 살짝 기분이 묘하네요... ^~^
개인 블로그를 직접 만들기 전까지 꾸준히 글 올려보도록 노력하겠습니다.
오늘 제가 풀어보았던 문제는 백준 온라인 저지(이하 백준)에 있는 16956번 문제 늑대와 양 입니다.
문제는 따로 설명 드리지 않고 제가 작성한 솔루션 위주로 설명을 드리고자 합니다.
따라서 문제가 궁금하시다면 백준 홈페이지에서 읽고 오시면 좋겠습니다 ~!
아직 알고리즘 능력이 많이 부족하기 때문에 코드가 효율적이지 않게 보일 수 있습니다.
코멘트 주시면 감사드리겠습니다. 그리고 조언해주신 내용을 고민할 수 있도록 하겠습니다.
시작하겠습니다.
늑대가 양에게 접근하지 못하게 분리하려면 늑대와 양은 무조건 떨어져 있어야 합니다.
목장에 늑대만 있으면 울타리를 설치할 필요 없습니다. (목장에 양만 있는 경우도 같습니다.)
입력받은 데이터에서 양의 좌표를 q
변수에 저장합니다. 동시에 양의 마리수 & 늑대 마리수를 cntS
& cntW
변수에 각각 저장합니다.
만약 양의 마리수가 0 이거나 혹은 늑대의 마리수가 0 이면 울타리 설치가 필요 없으니 바로 결과값을 출력합니다.
그렇지 않다면 함수 f()
를 실행합니다.
함수 f()
는 양의 좌표를 하나씩 꺼내고 양의 주위에 울타리를 설치합니다.
만약 양의 주위에 늑대가 있다면 바로 0을 리턴합니다.
만약 양의 주위가 빈 공간이라면 울타리를 설치해줍니다.
양의 주위에 울타리가 있거나 혹은 또 다른 양이 있다면 아무 처리도 하지 않습니다.
q
가 모두 비워질때까지 양의 주위에 늑대가 없다면 울타리를 설치할 수 있다는 의미이므로 1을 리턴합니다.
함수 f()
의 리턴값을 활용해 결과값을 출력합니다.
def f():
while q:
r, c = q.pop()
for dr, dc in [[1, 0], [0, 1], [-1, 0], [0, -1]]:
if 0 <= r + dr < R and 0 <= c + dc < C:
# 양의 주위에 늑대가 있는 경우
if brd[r+dr][c+dc] == 'W':
return 0
elif brd[r+dr][c+dc] == '.':
brd[r+dr][c+dc] = 'D'
return 1
R, C = map(int, input().split())
brd = [list(input()) for _ in range(R)]
q = []
cntS = 0
cntW = 0
for r in range(R):
for c in range(C):
if brd[r][c] == 'S':
cntS +=1
q.append([r, c])
elif brd[r][c] == 'W':
cntW += 1
# 목장에 양들만 있거나 혹은 목장에 늑대들만 있는 경우
if cntW == 0 or cntS == 0:
print(1)
for i in range(R):
print(''.join(brd[i]))
else:
result = f()
if result:
print(1)
for i in range(R):
print(''.join(brd[i]))
else:
print(0)