(2020 KAKAO Blind Recruitment) 기둥과 보 설치
Problem
카카오 홈페이지 코멘트
- 정답률
- 정확성: 1.9%
- 출제 의도
- 주어진 조건에 맞게 정확하게 코드를 작성할 수 있는지 파악
- 해설
- 주어진 대로 시뮬레이션 하면 되는 문제입니다. 기둥과 보를 설치하거나 삭제할 때, 인접한 기둥과 보가 조건을 만족하는지 정확하게 확인해야 합니다.
- 정확성: 1.9%
- 주어진 조건에 맞게 정확하게 코드를 작성할 수 있는지 파악
- 주어진 대로 시뮬레이션 하면 되는 문제입니다. 기둥과 보를 설치하거나 삭제할 때, 인접한 기둥과 보가 조건을 만족하는지 정확하게 확인해야 합니다.
My solution
def solution(n, build_frame):
def init(n):
res = []
for i in range(n + 1):
temp = []
for j in range(n + 1):
temp.append([j, i, 0, 0])
res.append(temp)
return res
def check(now_block, x, y):
res = True
if now_block[y][x][2] == 1: # 기둥
if y == 0 or now_block[y - 1][x][2] == 1 or now_block[y][x][3] == 1 or (
x > 0 and now_block[y][x - 1][3] == 1):
res = True
else:
return False
if now_block[y][x][3] == 1: # 보
if (y > 0 and now_block[y - 1][x][2] == 1) or (y > 0 and x < n and now_block[y - 1][x + 1][2] == 1) \
or (x > 0 and x < n and now_block[y][x - 1][3] == 1 and now_block[y][x + 1][3] == 1):
res = True
else:
return False
return res
block = init(n)
# build_frame: (가로, 세로, 종류, 설치여부)
for k in range(len(build_frame)):
build = build_frame[k]
x, y = build[0], build[1]
typ, act = build[2], build[3]
if act == 1:
if typ == 0: # 기둥
block[y][x][2] = block[y][x][2] + 1
if check(block, x, y) is False:
block[y][x][2] = block[y][x][2] - 1
else: # 보
block[y][x][3] = block[y][x][3] + 1
if check(block, x, y) is False:
block[y][x][3] = block[y][x][3] - 1
else: # act == 0
if typ == 0: # 기둥
if block[y][x][2] > 0:
block[y][x][2] = block[y][x][2] - 1
if (check(block, x, y) and check(block, x, y + 1) and check(block, x - 1, y + 1)) is False:
block[y][x][2] = block[y][x][2] + 1
else: # 보
if block[y][x][3] > 0:
block[y][x][3] = block[y][x][3] - 1
if (check(block, x, y) and check(block, x - 1, y) and check(block, x + 1, y)) is False:
block[y][x][3] = block[y][x][3] + 1
# return block
# answer: (가로, 세로, 종류)
answer = []
for i in range(len(block)):
for j in range(len(block)):
if block[j][i][2] > 0:
answer.append([block[j][i][0], block[j][i][1], block[j][i][2] - 1])
if block[j][i][3] > 0:
answer.append([block[j][i][0], block[j][i][1], block[j][i][3]])
return answer
def init(n):
res = []
for i in range(n + 1):
temp = []
for j in range(n + 1):
temp.append([j, i, 0, 0])
res.append(temp)
return res
def check(now_block, x, y):
res = True
if now_block[y][x][2] == 1: # 기둥
if y == 0 or now_block[y - 1][x][2] == 1 or now_block[y][x][3] == 1 or (
x > 0 and now_block[y][x - 1][3] == 1):
res = True
else:
return False
if now_block[y][x][3] == 1: # 보
if (y > 0 and now_block[y - 1][x][2] == 1) or (y > 0 and x < n and now_block[y - 1][x + 1][2] == 1) \
or (x > 0 and x < n and now_block[y][x - 1][3] == 1 and now_block[y][x + 1][3] == 1):
res = True
else:
return False
return res
block = init(n)
# build_frame: (가로, 세로, 종류, 설치여부)
for k in range(len(build_frame)):
build = build_frame[k]
x, y = build[0], build[1]
typ, act = build[2], build[3]
if act == 1:
if typ == 0: # 기둥
block[y][x][2] = block[y][x][2] + 1
if check(block, x, y) is False:
block[y][x][2] = block[y][x][2] - 1
else: # 보
block[y][x][3] = block[y][x][3] + 1
if check(block, x, y) is False:
block[y][x][3] = block[y][x][3] - 1
else: # act == 0
if typ == 0: # 기둥
if block[y][x][2] > 0:
block[y][x][2] = block[y][x][2] - 1
if (check(block, x, y) and check(block, x, y + 1) and check(block, x - 1, y + 1)) is False:
block[y][x][2] = block[y][x][2] + 1
else: # 보
if block[y][x][3] > 0:
block[y][x][3] = block[y][x][3] - 1
if (check(block, x, y) and check(block, x - 1, y) and check(block, x + 1, y)) is False:
block[y][x][3] = block[y][x][3] + 1
# return block
# answer: (가로, 세로, 종류)
answer = []
for i in range(len(block)):
for j in range(len(block)):
if block[j][i][2] > 0:
answer.append([block[j][i][0], block[j][i][1], block[j][i][2] - 1])
if block[j][i][3] > 0:
answer.append([block[j][i][0], block[j][i][1], block[j][i][3]])
return answer
댓글
댓글 쓰기