https://school.programmers.co.kr/learn/courses/30/lessons/60061
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
프로그래머스 - 기둥과 보 설치 (60061번)
난이도 : Lv 3
알고리즘&자료구조 : Implementation (구현)
def solution(n, build_frame):
memo = [[[0, 0] for _ in range(n+1)] for _ in range(n+2)]
for x, y, a, b in build_frame:
x += 1
if b: # install
if a: # beam
if memo[x][y-1][0] or memo[x+1][y-1][0] or (memo[x-1][y][1] and memo[x+1][y][1]):
memo[x][y][1] = 1
else: # pillar
if not y or memo[x][y-1][0] or memo[x-1][y][1] or memo[x][y][1]:
memo[x][y][0] = 1
else: # delete
if a: # beam
if memo[x-1][y][1] and (memo[x-1][y-1][0] == memo[x][y-1][0] == 0):
continue
if memo[x+1][y][1] and (memo[x+1][y-1][0] == memo[x+2][y-1][0] == 0):
continue
if memo[x][y][0] and (memo[x-1][y][1] == memo[x][y-1][0] == 0):
continue
if memo[x+1][y][0] and (memo[x+1][y][1] == memo[x+1][y-1][0] == 0):
continue
memo[x][y][1] = 0
else: # pillar
if memo[x-1][y+1][1]:
if not memo[x-1][y][0] and not (memo[x-2][y+1][1] == memo[x][y+1][1] == 1):
continue
if memo[x][y+1][1]:
if not memo[x+1][y][0] and not (memo[x-1][y+1][1] == memo[x+1][y+1][1] == 1):
continue
if memo[x][y+1][0]:
if memo[x-1][y+1][1] == memo[x][y+1][1] == 0:
continue
memo[x][y][0] = 0
answer = []
for x in range(1, n+2):
for y in range(n+1):
for i in range(2):
if memo[x][y][i]:
answer.append([x-1, y, i])
return answer
2020 KAKAO BLIND RECRUITMENT 기출문제이다.
구현 문제 그 자체이다.
① 보 설치
아래의 3가지 중 하나라도 해당되면, 보 설치가 가능하다.
▷ 왼쪽 아래에 기둥이 있다.
▷ 오른쪽 아래에 기둥이 있다.
▷ 양쪽 모두 보가 있다.
② 보 제거
위의 4가지가 모두 해당되면, 보 제거가 가능하다.
▷ 왼쪽에 보가 존재한다면, 왼쪽 보의 양 끝 아래 중 적어도 하나의 기둥이 존재해야 한다.
(왼쪽 보가 없으면 상관 없다.)
▷ 오른쪽에 보가 존재한다면, 오른쪽 보의 양 끝 아래 중 적어도 하나의 기둥이 존재해야 한다.
(오른쪽 보가 없으면 상관 없다.)
▷ 왼쪽에 기둥이 올려져있다면, 왼쪽 보 또는 왼쪽 아래 기둥 중 적어도 하나는 존재해야 한다.
(왼쪽 기둥이 없으면 상관 없다.)
▷ 오른쪽에 기둥이 올려져있다면, 오른쪽 보 또는 오른쪽 아래 기둥이 적어도 하나는 존재해야 한다.(오른쪽 기둥이 없으면 상관 없다.)
③ 기둥 설치
아래의 4가지 중 하나라도 해당되면, 기둥 설치가 가능하다.
▷ 바닥이다.
▷ 아래에 기둥이 있다.
▷ 왼쪽에 보가 있다.
▷ 오른쪽에 보가 있다.
④ 기둥 제거
아래의 4가지 중 하나라도 해당되면, 기둥 제거가 가능하다.
▷ 왼쪽에 보가 있다면, 왼쪽 보의 왼쪽과 오른쪽에 모두 보가 있거나, 왼쪽 보의 왼쪽 아래에 기둥이 존재해야 한다.
(왼쪽 보가 없으면 상관 없다.)
▷ 오른쪽에 보가 있다면, 오른쪽 보의 왼쪽과 오른쪽에 모두 보가 있거나, 오른쪽 보의 오른쪽 아래에 기둥이 존재해야 한다.
(오른쪽 보가 없으면 상관 없다.)
▷ 위에 기둥이 있다면, 왼쪽 또는 오른쪽 중 적어도 하나에 보가 존재해야 한다.
(위쪽 기둥이 없으면 상관 없다.)
위의 조건들을 그대로 코드로 구현하고,
기둥 또는 보가 존재하는 좌표들을, (x축, y축, 기둥, 보) 순서대로 정렬해서 반환하면 된다.
'Algorithm' 카테고리의 다른 글
거리두기 확인하기 (81302번) - 프로그래머스 (Programmers) (0) | 2023.07.01 |
---|---|
전화번호 목록 (5052번) - 백준 (BOJ) (0) | 2023.07.01 |
이분 그래프 (1707번) - 백준 (BOJ) (0) | 2023.06.28 |
다단계 칫솔 판매 (77486번) - 프로그래머스 (Programmers) (0) | 2023.06.27 |
수 묶기 (1744번) - 백준 (BOJ) (0) | 2023.06.26 |