https://school.programmers.co.kr/learn/courses/30/lessons/60061
1. 설치,삭제할 때마다, 해당 지점이 조건을 만족하는지 본다
2. 조건 구현해서 프로그래밍하자
1. 조건을 잘못 잡은 거 같다
2. 추가,삭제 조건을 수행하면서 누락된 케이스가 존재했다.
1. 추가,삭제 후, 해당 board가 가능한지 반복한다
개선된 풀이로 진행할 경우, 코드가 더 깔끔해집니다.
현재 추가한 보드의 상태를 쭉 보면서
설치,삭제가 가능한지 보고
안된다면 되돌리기를 해주는 방식입니다.
(초기 방식대로 설치,삭제할때마다 조건을 고려했는데
따로따로 구현하려니 코드가 복잡해져서
결국 이 방법을 택했습니다.)
def possible(result):
for x, y, a in result:
# 기둥을 판별
# 기둥이 안되는 경우
if a == 0:
if y != 0 and (x, y - 1, 0) not in result and \
(x - 1, y, 1) not in result and (x, y, 1) not in result:
return False
# 보를 판별
# 보가 안되는 경우
else:
if (x, y - 1, 0) not in result and (x + 1, y - 1, 0) not in result and \
not ((x - 1, y, 1) in result and (x + 1, y, 1) in result):
return False
return True
def solution(n, build_frame):
answer = []
# 하나씩 넣고 가능한지 안한지 계속 판별해준다
for x, y, a, b in build_frame:
now = (x, y, a)
# 설치
if b == 1:
answer.append(now)
if not possible(answer):
ind = answer.index(now)
answer.pop(ind)
# 삭제
else:
if not now in answer:
continue
ind = answer.index(now)
answer.pop(ind)
if not possible(answer):
answer.append(now)
# board=[[[0,0]for _ in range(n+1)]for _ in range(n+1)]
# for y,x,a,b in build_frame:
# #설치하는 케이스
# if b==1:
# if a==0:
# #바닥위, 보의 한쪽끝위, 다른 기둥 위
# if x==0 or board[x][y][1]==1 or board[x][y][0]==1:
# board[x][y][0]=1
# board[x+1][y][0]=1
# answer.append([y,x,a])
# elif a==1:
# #왼쪽기준, 기둥위나 보의 연장
# if board[x][y][0]==1 or board[x][y][1]==1:
# board[x][y][1]=1
# board[x][y+1][1]=1
# answer.append([y,x,a])
# #오른쪽기준, 기둥위나 보의 연장
# elif y<n and (board[x][y+1][1]==1 or board[x][y+1][0]==1):
# board[x][y][1]=1
# board[x][y+1][1]=1
# answer.append([y,x,a])
# #삭제하는 케이스
# if b==0:
# if not [y,x,a] in answer:
# continue
# #보나 기둥을 삭제할 때, 다른 보와 기둥이 존재할 수 없다면 넘김
# if a==0:
# #지우는 기둥위에 다른 기둥이 있거나 보가 있는가
# #다른 기둥이 있는가
# if x>=n-1:
# continue
# if board[x+2][y][0]==1:
# continue
# #기둥위에 보가 있을때, 그 보가 기둥이 2개밖에 없으면 못지움
# elif (y>0 and y<=n) and(not (board[x+1][y][1] and board[x+1][y-1][1]) and (board[x+1][y][1] and board[x+1][y+1][1])):
# continue
# board[x][y][0]=0
# board[x+1][y][0]=0
# ind=answer.index([y,x,a])
# answer.pop(ind)
# elif a==1:
# #지우는 보 기준, 다른 보와 이어져있는가 혹은 그 위에 다른 기둥이 있는가
# if (y>0 and board[x][y-1][1]) or (y<n and board[x][y+1][1]) or board[x][y][0] or board[x][y+1][0]:
# continue
# board[x][y][1]=0
# board[x][y+1][1]=0
# ind=answer.index([y,x,a])
# answer.pop(ind)
# answer.sort()
answer.sort()
return answer
[프로그래머스Lv.3] 합승택시요금(파이썬) (0) | 2023.03.06 |
---|---|
[프로그래머스 Lv.3] 경주로 건설(파이썬) (1) | 2023.03.02 |
[프로그래머스Lv.3] 미로탈출 명령어(파이썬) (0) | 2023.02.27 |
[프로그래머스Lv.3] 공 이동 시뮬레이션(파이썬) (1) | 2023.02.23 |
[프로그래머스Lv.3] 등산코스정하기(파이썬) (0) | 2023.02.20 |
댓글 영역