프로그래머스, 2020 카카오 공채 코딩테스트 기출 - 기둥과 보 설치 LV3
https://programmers.co.kr/learn/courses/30/lessons/60061
시뮬레이션 해보고 설치 혹은 제거가 가능한지 매번 확인해가는 방식
set 이용, 좌표화, 추상화, 조건 체크
벽면의 크기 n, 기둥과 보를 설치하거나 삭제하는 작업이 순서대로 담긴 2차원 배열 build_frame이 매개변수로 주어질 때, 모든 명령어를 수행한 후 구조물의 상태를 return 하도록 solution 함수를 완성해주세요.
입출력 예
n 5 build_frame [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] result [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]]
솔루션
기둥, 혹은 보를 설치/제거 한후 설치된 모든 기둥과 보들이 주어진 조건에 맞게 설치되어 있는지 확인한다.
기둥 설치가 가능한경우 :
1) 맨 밑에 있는 경우
2) 설치 아래 지점에 기둥이 있는 경우
3) 설치 왼쪽 지점에 보가 있는 경우
4) 설치 지점에 보가 있는 경우
-> 모든 조건을 만족하지 않으면 설치 불가능
보 설치가 가능한경우 :
1) 설치 아래 지점에 기둥이 있는 경우
2) 설치 아래 오른쪽 지점에 기둥이 있는 경우
3) 양 옆에 보가 있는 경우
-> 모든 조건을 만족하지 않으면 설치 불가능
코드
# 파이썬
def impossible(result):
COL, ROW = 0, 1
for x, y, a in result:
if a == COL: # 기둥일 때
if y != 0 and (x, y-1, COL) not in result and \
(x-1, y, ROW) not in result and (x, y, ROW) not in result:
return True
else: # 보일 때
if (x, y-1, COL) not in result and (x+1, y-1, COL) not in result and \
not ((x-1, y, ROW) in result and (x+1, y, ROW) in result):
return True
return False
def solution(n, build_frame):
result = set()
for x, y, a, build in build_frame:
item = (x, y, a)
if build: # 추가일 때
result.add(item)
if impossible(result):
result.remove(item)
elif item in result: # 삭제할 때
result.remove(item)
if impossible(result):
result.add(item)
answer = map(list, result)
return sorted(answer, key = lambda x : (x[0], x[1], x[2]))
**팁 :
시간적인 효율성 체크는 없지만 set을 사용하면 시간을 단축시킬 수 있다.
좋은 코드 배워갑니다