https://www.acmicpc.net/problem/2615
1. 난이도 실버1
2. 내가 작성한 코드
maps = [list(map(int, input().split())) for _ in range(19)]
total_arrow = {"down":(1,0),"right":(0,1),'down_right':(1,1),'down_left':(1,-1)}
visit_down = [[0] * 19 for _ in range(19)]
visit_right = [[0] * 19 for _ in range(19)]
visit_downleft = [[0] * 19 for _ in range(19)]
visit_downright = [[0] * 19 for _ in range(19)]
def repeat(visit,x,y,arrow, color, cnt):
nx = x + total_arrow[arrow][0]
ny = y + total_arrow[arrow][1]
if nx<=18 and ny<=18 and nx>=0 and ny>=0:
if visit[nx][ny] == 0:
visit[nx][ny] = 1
if maps[nx][ny] == color:
cnt+=1
return repeat(visit,nx,ny,arrow,color,cnt)
else:
return cnt
else:
return cnt
else:
return cnt
for i in range(19):
for j in range(19):
if maps[i][j] != 0:
down = repeat(visit_down,i,j,"down",maps[i][j],1)
right = repeat(visit_right,i,j,"right",maps[i][j],1)
down_left = repeat(visit_downleft,i,j,"down_left",maps[i][j],1)
down_right = repeat(visit_downright,i,j,"down_right",maps[i][j],1)
if 5 in [down,right,down_right]:
print(maps[i][j])
print(i+1,j+1)
exit()
if 5 == down_left:
print(maps[i][j])
print(i+5, j-3)
exit()
print(0)
나는 대각선을 검사할 때 ↘, ↙ 방향으로 검사를 했더니 오류가 났다
맞 왜 틀? 이라고 생각하며 문제를 차근차근 보며 깨달은 것은
제일 왼쪽에 바둑알의 행과 열을 순서로 출력해야 하는데, ↙ 으로 하는 경우 I,J 이 맨 왼쪽에 있는 바둑알이 아닌 것이었다!
따라서 아래, 오른쪽, ↗, ↘ 방향으로 검사하는 게 더 편하다.
문제 자체를 재귀 + 방향 별 다른 배열을 만들어서 cnt를 체크했는데
그냥 BFS를 돌리면 되는 문제였다.
아래처럼 푸는게 베스트인듯!
https://velog.io/@hygge/Python-%EB%B0%B1%EC%A4%80-2615-%EC%98%A4%EB%AA%A9-Brute-Force
'🔅코딩테스트 공부🔅 > ❗백준' 카테고리의 다른 글
[백준] 배열 돌리기(python) (0) | 2023.04.23 |
---|---|
[백준] 22858번 원상 복구(small)(python) (0) | 2023.04.22 |
[백준] 17413번 단어 뒤집기2(python) (0) | 2023.04.21 |
[백준] 20291 파일 정리(python) (1) | 2023.04.20 |
[백준] 12933번 오리(python) (0) | 2023.04.20 |
댓글