티스토리 뷰
문제출처 - https://programmers.co.kr/learn/courses/30/lessons/60061
틀린 풀이1
# 9.6점...
# build_frame = [x, y, a, b]
# a: 0 = 기둥, 1 = 보
# b: 0 = 삭제, 1 = 설치
def check(frame, ans):
# 기둥인 경우
if frame[2] == 0:
if frame[1] == 0: # 1. 바닥 위에 있어야댐
return True
try: # 2. 보의 한쪽 끝 부분 위에 있어야댐
if ans.index([frame[0]-1, frame[1], 1]) >= 0:
return True
except: cnt = 0
try: # 2. 보의 한쪽 끝 부분 위에 있어야댐
if ans.index([frame[0]+1, frame[1], 1]) >= 0:
return True
except: cnt = 0
try: # 3. 다른 기둥 위에 있어야댐
if ans.index([frame[0], frame[1]-1, 0]) >= 0:
return True
except:
return False
# 보인 경우
else:
try: # 1. 한쪽 끝 부분이 기둥 위에 있어야댐(왼쪽)
if ans.index([frame[0], frame[1]-1, 0]) >= 0:
return True
except: cnt = 0
try: # 1. 한쪽 끝 부분이 기둥 위에 있어야댐(오른쪽)
if ans.index([frame[0]+1, frame[1]-1, 0]) >= 0:
return True
except: cnt = 0
try: # 2. 양쪽 끝 부분이 다른 보와 동시에 연결
if ans.index([frame[0]-1, frame[1], 1]) >= 0 and ans.index([frame[0]+1, frame[1], 1]) >= 0:
# 삭제할때 옆에 있는 보가 조건을 만족하지 않는 경우
try:
ans.index([frame[0] - 1, frame[1] - 1, 0])
ans.index([frame[0] + 2, frame[1] - 1, 0])
except:
return False
return True
except:
return False
def solution(n, build_frame):
answer = [] # 정렬
arr = [[-1] * n for _ in range(n)]
for frame in build_frame:
# 설치하는 경우 설치 가능한지 체크
if frame[3] == 1:
#print("설치", check(frame, answer), frame)
if check(frame, answer):
answer.append(frame[:3])
# 삭제하는 경우 삭제 가능한지 체크
else:
#print("삭제", check(frame, answer))
if check(frame, answer):
answer.pop(answer.index(frame[:3]))
#print(answer)
answer.sort()
return answer
파이썬의 아주 유용한 연산자인 in 을 까먹고 try-except문을 써서 코드가 굉장히 길어졌다...
틀린 풀이 2
# 19.6점...
def check(frame, ans):
x, y, what = frame
# 기둥
# 1. 바닥 위에 있어야댐
# 2. 보의 한쪽 끝 부분 위에 있어야댐
# 3. 다른 기둥 위에 있어야댐
if what == 0:
if y == 0 or [x-1, y, 1] in ans or [x, y, 1] in ans or [x, y-1, 0] in ans:
return True
# 보
# 1. 한쪽 끝 부분이 기둥 위에 있어야댐
# 2. 양쪽 끝 부분이 다른 보와 동시에 연결
else:
if [x, y-1, 0] in ans or [x+1, y-1, 0] in ans:
return True
if [x-1, y, 1] in ans and [x+1, y, 1] in ans:
if [x-1, y-1, 0] in ans and [x+2, y-1, 0] in ans:
return True
return False
def solution(n, build_frame):
answer = []
for frame in build_frame:
x, y, what, how = frame
if how == 1: # 설치
if check([x, y, what], answer):
answer.append([x, y, what])
else: # 삭제
if check([x, y, what], answer):
answer.remove([x, y, what])
answer.sort()
return answer
이번엔 in 연산자를 사용해 풀었는데 여전히 런타임에러나고.. 난리남
check함수에서 규칙에 맞으면 바로 True 리턴하고 그 외의 것들은 False를 리턴하게 구현함
성공한 풀이
def check(ans):
for x, y, what in ans:
# 기둥
# 1. 바닥 위에 있어야댐
# 2. 보의 한쪽 끝 부분 위에 있어야댐
# 3. 다른 기둥 위에 있어야댐
if what == 0:
if y == 0 or [x-1, y, 1] in ans or [x, y, 1] in ans or [x, y-1, 0] in ans:
continue
else:
return False
# 보
# 1. 한쪽 끝 부분이 기둥 위에 있어야댐
# 2. 양쪽 끝 부분이 다른 보와 동시에 연결
elif what == 1:
if [x, y-1, 0] in ans or [x+1, y-1, 0] in ans or ([x-1, y, 1] in ans and [x+1, y, 1] in ans):
continue
else:
return False
return True
def solution(n, build_frame):
answer = []
for f in build_frame:
x, y, what, how = f
if how == 1: # 설치
answer.append([x, y, what])
if check(answer) is False:
answer.remove([x, y, what])
else: # 삭제
answer.remove([x, y, what])
if check(answer) is False:
answer.append([x, y, what])
answer.sort()
return answer
설명
위의 틀린 풀이와 다른 점은
1. solution()에서 check함수에 answer를 넘겨주기 전에 먼저 answer에 값을 추가해줌
2. check() 함수에 넘겨주는 인자 중 frame을 빼고 함수 안에서 for문을 돌려줌!!!🌟🌟🌟 -> answer에 있는 모든 값을 검사해줘야댐
2-1. 규칙에 맞으면 continue, 규칙 이외의 모든 것들은 False
'ALGORITHM > 프로그래머스' 카테고리의 다른 글
[Python][2019 KAKAO] 프로그래머스 - 후보키(LEVEL2) (0) | 2020.04.04 |
---|---|
[Python][2020 KAKAO] 프로그래머스 - 자물쇠와 열쇠(LEVEL3) (3) | 2020.04.02 |
[Python][2020 KAKAO] 프로그래머스 - 괄호변환(LEVEL2) (2) | 2020.03.22 |
[Python][2020 KAKAO] 프로그래머스 - 문자열 압축(LEVEL2) (2) | 2020.03.20 |
[Python] 프로그래머스 - 짝지어 제거하기(LEVEL2) (0) | 2020.03.14 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- dictionary
- 정렬
- programmers
- SW Expert
- BOJ
- 2020 KAKAO BLIND RECRUITMENT
- SWExpert
- 2019 Kakao Blind Recruitment
- 파이썬
- 순열
- C++
- 백준
- 코딩테스트
- 문자열
- hash
- Permutation
- 문자열처리
- 구현
- Python
- 프로그래머스
- 딕셔너리
- 스택
- combination
- 해시
- left join
- 우선순위큐
- 힙
- 재귀
- 완전탐색
- 괄호
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함