Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- MySQL
- hackerrank
- Machine Learning Advanced
- DilatedNet
- 큐
- TEAM-EDA
- Segmentation
- eda
- 알고리즘
- Object Detection
- 엘리스
- 입문
- 추천시스템
- 3줄 논문
- 협업필터링
- 코딩테스트
- 파이썬
- 튜토리얼
- Python
- 프로그래머스
- Semantic Segmentation
- TEAM EDA
- 나는리뷰어다
- Image Segmentation
- DFS
- Recsys-KR
- 나는 리뷰어다
- 한빛미디어
- 스택
- pytorch
Archives
- Today
- Total
TEAM EDA
[프로그래머스] 땅따먹기 / 파이썬 본문
땅따먹기
문제 설명
땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다. 단, 땅따먹기 게임에는 한 행씩 내려올 때, 같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다.
예를 들면,
| 1 | 2 | 3 | 5 |
| 5 | 6 | 7 | 8 |
| 4 | 3 | 2 | 1 |
로 땅이 주어졌다면, 1행에서 네번째 칸 (5)를 밟았으면, 2행의 네번째 칸 (8)은 밟을 수 없습니다.
마지막 행까지 모두 내려왔을 때, 얻을 수 있는 점수의 최대값을 return하는 solution 함수를 완성해 주세요. 위 예의 경우, 1행의 네번째 칸 (5), 2행의 세번째 칸 (7), 3행의 첫번째 칸 (4) 땅을 밟아 16점이 최고점이 되므로 16을 return 하면 됩니다.
제한사항
- 행의 개수 N : 100,000 이하의 자연수
- 열의 개수는 4개이고, 땅(land)은 2차원 배열로 주어집니다.
- 점수 : 100 이하의 자연수
입출력 예
land | answer |
---|---|
[[1,2,3,5],[5,6,7,8],[4,3,2,1]] | 16 |
입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.
풀이
- dfs로 풀었던 코드
- 모든 케이스에 대해 런타임에러가 발생
- max값을 계산하는 부분에서 버퍼가 발생
- 저장하는 값이 너무 많고 재귀가 깊어짐
from itertools import chain
def dfs(land, view, cnt, cnt_):
answer = []
# 마지막까지 밟았으면 결과를 출력
if cnt == len(land): return cnt_
# 전에 밟은 위치는 밟으면 안됨
else:
for i in range(len(land[0])):
if view[cnt - 1][i] == 0:
view[cnt][i] = 1
answer.append(dfs(land, view, cnt + 1, cnt_ + land[cnt][i]))
view[cnt][i] = 0
else:
continue
return answer
def solution(land):
answer = []
view = [[0 for c in range(len(land[0]))] for c in range(len(land))]
for i in range(len(land[0])):
view[0][i] = 1
answer.append(dfs(land, view, 1, land[0][i]))
view[0][i] = 0
solution = 0
for j in answer:
for h in j:
if solution < max(h): solution = max(h)
return solution
수정된 풀이
- 이전 행의 최대값을 더해가는 방식
- land에 이전행의 최댓값을 더해가면서, 가능한 경우중에서 좋은 경우만을 남기도록 탐욕적 기법을 사용
- 단, 이전행에서 같은 열은 제외
def solution(land):
for i in range(0, len(land)-1):
land[i+1][0] += max(land[i][1],land[i][2],land[i][3])
land[i+1][1] += max(land[i][0],land[i][2],land[i][3])
land[i+1][2] += max(land[i][0],land[i][1],land[i][3])
land[i+1][3] += max(land[i][0],land[i][1],land[i][2])
return max(land[len(land)-1])
- 다른사람의 풀이에서 동일한 부분을 아래와 같이 수정해서 사용함(4개의 케이스를 for문으로 해결)
def solution(land):
for i in range(1, len(land)):
for j in range(len(land[0])):
land[i][j] = max(land[i -1][: j] + land[i - 1][j + 1:]) + land[i][j]
return max(land[-1])
출처: 프로그래머스 코딩 테스트 연습,https://programmers.co.kr/learn/challenges
'EDA Study > 알고리즘' 카테고리의 다른 글
[프로그래머스] 숫자의 표현 / 파이썬 (0) | 2020.04.16 |
---|---|
[프로그래머스] 폰켓몬 / 파이썬 (1) | 2020.04.14 |
[프로그래머스] 다음 큰 숫자 / 파이썬 (0) | 2020.04.12 |
[프로그래머스] 올바른 괄호 / 파이썬 (0) | 2020.04.11 |
[프로그래머스] 카펫 / 파이썬 (0) | 2020.04.09 |