Problem Solving/Programmers

[Programmers] 2020 KAKAO BLIND RECRUITMENT: 기둥과 보 설치(Python)

이진2 2021. 6. 9. 03:30

https://programmers.co.kr/learn/courses/30/lessons/60061?language=python3 

 

코딩테스트 연습 - 기둥과 보 설치

5 [[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]] [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] 5 [[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] [[

programmers.co.kr

정말 악랄한 문제 ~~

구현 문제를 오랜만에 풀어서 그런지 설계 부분에서 [보는 양쪽 끝단이 존재한다]라는 조건을 빼먹었고

그리고 기둥과 보가 같은 좌표에 존재할 수 있다는 것도 간과했당

질문게시판이 없엇다면......^^ 3일 걸렸을 듯

 

이번 주에 카카오식 구현 문제를 많이많이 풀어봐서 얼른 적응해야겠다 ~~~

pillar=[]
beam=[]

def pillarCheck(x, y):
  if y==0: return True
  elif (x>0 and beam[y][x-1]) or beam[y][x]: return True
  elif pillar[y-1][x]: return True
  return False

def beamCheck(x, y):
  if pillar[y-1][x] or pillar[y-1][x+1]: return True
  elif beam[y][x-1] and beam[y][x+1]: return True
  return False

def deleteCheck():
  for i in range(len(pillar)):
    for j in range(len(pillar[i])):
      if pillar[i][j]:
        if pillarCheck(j,i)==False: return False
      if beam[i][j]:
        if beamCheck(j,i)==False: return False
  return True

def solution(n, build_frame):
  global pillar, beam
  answer = []
  n+=1

  pillar=[[0 for _ in range(n)] for _ in range(n)]
  beam=[[0 for _ in range(n)] for _ in range(n)]


  for x,y,a,b in build_frame:

    if b==0:
      if a==0: 
        pillar[y][x]=0
        if deleteCheck()==False:
          pillar[y][x]=1
      else: 
        beam[y][x]=0
        if deleteCheck()==False:
          beam[y][x]=1
    else:
      if a==0 and pillarCheck(x,y)==True: pillar[y][x]=1
      elif a==1 and beamCheck(x,y)==True: beam[y][x]=1

  for i in range(n):
    for j in range(n):
      if pillar[i][j]: answer.append([j,i,0])
      if beam[i][j]: answer.append([j,i,1])

  return sorted(answer)