/ 제출 1 /
n, m = map(int, input().split())
answer = []
board = []
# 상 하 좌 우
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
cannot = []
for i in range(n):
board.append(list(input().strip()))
for x in range(n):
for y in range(m):
if board[x][y] == '*':
size = 1
check = True
while check:
# check 4 directions
for i in range(4):
nx = x + dx[i] * size
ny = y + dy[i] * size
if nx < 0 or n <= nx or ny < 0 or m <= ny or board[nx][ny] == '.':
check = False
size -= 1
if check:
size += 1
else:
if size >= 1:
while size > 0:
answer.append([x, y, size])
size -= 1
for ans in answer:
x, y, size = ans
while size > 0:
for i in range(4):
nx = x + dx[i] * size
ny = y + dy[i] * size
if not(nx < 0 or n <= nx or ny < 0 or m <= ny):
if board[nx][ny] == '*':
board[nx][ny] = '.'
board[x][y] = '.'
size -= 1
possible = True
for i in range(n):
for j in range(m):
if board[i][j] == '*':
possible = False
if possible:
print(len(answer))
for i in range(len(answer)):
x, y, size = answer[i]
print(x+1, y+1, size)
else:
print(-1)
집념의 풀이.. 축하합니다 나 자신 ^.^
1차 문제 해결 27분 걸리고, 오류 나서 수정했습니다.
(nx, ny)를 체크할 때 범위 설정을 반대로 해줬던 문제 바로잡았습니다.
왜 오류였는지 찾는데 은근 오래 걸렸습니다. 문제해결 핵심 부분이 아니라서 무신경해서였습니다.
2차 문제 해결 48분 걸렸습니다. 예제 테케 4개 중 3번째 문제에서 답이 원하는 대로 나오지 않았습니다.
그냥 십자가를 찾아내는게 아니라 십자가를 이용해 주어진 격자판을 만들 수 있니? 가 주요 문제고,
있을 때 십자가도 말해줘!가 부수문제였기 때문입니다.
저는 문제 풀며 두 번째에 집중했기에 2차 문제 해결에서 오류 테케가 있었던 것이었습니다.
만약 히든테케 문제였다면 틀림 없이 틀렸겠죠.. 여러가지로 생각해보고 문제 구현, 테케 확실히 잘 정의하기로 합시다.
하여간 해당 문제는 찾아낸 십자가를 이용해 맵을 재구성하는 부분을 추가했습니다.
십자가만큼 지우고 남은 보드에서 * 이 남아있다면 십자가로는 해당 보드를 못 만든다는 아이디어입니다.
좋은 풀이는 아닐 것 같다는 생각은 풀면서도 들었지만, 제출 후에 확신했습니다.
채점에 18분이 소요되었기 때문입니다. 몇%에서 혹시 틀려버릴까 궁금해 냅다 기다렸는데, 결국 다 통과하긴 했습니다.
시간초과도 안 났고요. 아슬아슬하게 넘긴 것 같습니다.
다른 분들 풀이를 보고 개선점을 많이 찾아봐야겠습니다.
효율적이지는 않더라도 격자판 구현문제인데 (약점) 1시간 2분안에 제출+통과했다는 점에서 나름 안도했던 문제였습니다.
/ 다른 분들 풀이 /
일단 시간이 미친듯이 오래 걸린 이유는 데이터를 받을 때 input()으로 받았기 때문이었습니다.
sys를 import해서 sys.stdin.readline()으로 데이터를 받도록 바꿔주니 시간이 약간 빨라졌습니다.
'CodingTest > Baekjun Online Judge' 카테고리의 다른 글
[ 백준 / BOJ ] 2504 괄호의 값 (0) | 2022.07.01 |
---|---|
[ 백준 / BOJ ] 1966 프린터 큐 (0) | 2022.07.01 |
[ 백준 / BOJ ] 16922 로마 숫자 만들기 (0) | 2022.06.30 |
[ 백준 / BOJ ] 16917 양념 반 후라이드 반 (0) | 2022.06.30 |
[ 백준 / BOJ ] 1913 달팽이 ( 다시 풀기 ) (0) | 2022.06.30 |