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 |
Tags
- ODQA
- 알고리즘스터디
- mrc
- 최단경로
- 개인회고
- python3
- 구현
- 그리디
- 파이썬 3
- 그래프이론
- 기술면접
- 부스트캠프_AITech_3기
- Level1
- dfs
- Level2_PStage
- U_stage
- 이진탐색
- 단계별문제풀이
- 이코테
- 백준
- 백트랙킹
- dp
- 다시보기
- 부스트캠프_AITech3기
- Level2
- 알고리즘_스터디
- 프로그래머스
- 정렬
- 글또
- 주간회고
Archives
- Today
- Total
국문과 유목민
[구현] 기둥과 보 설치 본문
"이것이 코딩테스트다(나동빈 저)"에서 나온 문제에 대한 코드를 다루고 있습니다.
문제에 대한 구체적인 설명과 조건 등은 책을 참고해주시기 바랍니다.
소요시간: 40분 + a (항복)
1. 문제 설명
- 프로그래머스 문제
- 보와 기둥을 설치하는데 조건들을 고려해서 설치를 하고, 설치가 되었을 때 최종 보와 기둥들의 위치를 출력하는 코드
2. 접근 방식
- 우선 보의 조건과 기둥의 조건을 각각 확인해야 한다.
- 그래서 만약 보나 기둥을 설치할 때, 해당 조건에 부합하는지 확인
- 만약 기둥을 설치하려면 해당 조건에 부합하는지 확인
- answer 리스트에 이미 있는지를 확인하는게 중요해 보인다.
- 해당 문제를 끝까지 풀지 못한 입장에서 중요한 부분 두 가지를 꼽자면,
1. 리스트를 삭제해보고 체크를 하고 체크한 결과가 안 되면 다시 리스트를 추가하는 부분
2. answer리스트를 확인하는 함수를 만드는 부분
이렇게 2가지 부분이라고 생각한다. 위 조건문이 간단해보인다고 할 지라도, '보'와 '기둥'을 설치하는 조건이 어떤 식으로 주어지는지 정확한 이해가 있어야 풀 수 있는 문제였다.
3. 코드
- 내가 풀던 코드 _Fail
def check_build(answer, x, y, a):
if a == 0: # 기둥일 때의 조건
for ls2 in answer:
if (y == 0) or (ls2[2] == 0 and ls2[0] == x and ls[1]+1 == y) or (ls2[2] == 1 and ls2[0]+1 == x and ls[1] == y):
return True
else:
return False
else: # 보일 때의 조건
for ls2 in answer:
if (ls2[2] == 0 and ls[0] == x and ls[1]== y) or (ls2[2] == 0 and ls[0]-1 == x and ls[1] +1 == y) or (ls[2] == 1 and ls[1] == y and ls[0]==x-1):
return True
else:
return False
def solution(n, build_frame):
# answer의 원소는 [x, y, 기둥/보]
answer = []
print(ls)
for ls in build_frame:
x, y, a, b = ls
if b == 0: #삭제
if check_build:
answer.remove([x, y, a])
else:
continue
else: # 설치
if check_build:
answer.append([x, y, a])
else:
continue
return answer
- 해답 코드
def possible(answer):
for x, y, stuff in answer:
if stuff == 0: # 기둥일 때
if y==0 or [x-1, y, 1] in answer or [x, y, 1] in answer or [x, y-1, 0] in answer:
continue
return False
elif stuff == 1:
# 한 쪽 끝이 기둥에 있을 때 (왼쪽, 오른쪽), 양쪽에 보가 있을 때
if [x, y -1, 0] in answer or [x+1, y-1, 0] in answer or ([x-1, y, 1] in answer and [x+1, y, 1] in answer):
continue
return False
# 조건에서 한 경우라도 만족하지 못한다면 거짓
return True
def solution(n, build_frame):
# answer의 원소는 [x, y, 기둥/보]
answer = []
for frame in build_frame:
x, y, stuff, operate = frame
if operate == 0: #삭제
answer.remove([x, y, stuff]) # 일단 삭제해보고
if not possible(answer): # 삭제한 게 안도면
answer.append([x, y, stuff]) # 다시 설치
elif operate ==1: # 설치
answer.append([x, y, stuff])
if not possible(answer):
answer.remove([x, y, stuff])
return sorted(answer)
4. 코멘트
- 문제를 이해하는데 힘들었던 것 같다. 특히, 보와 기둥이 어떤 식으로 입력이 되는지 이해를 하는데 힘들었던 것 같다.
- 접근 방법이 얼추 맞긴 했었는데, 그 속에서 규칙을 찾는 것까지 못해서 어려웠던 것 같다. 특히 양쪽 보를 확인해야 하는 부분을 구현하려고 할 때 막혔었다.
- 특히 나는 'in'을 사용할 생각을 못하고 일일이 '=='연산자를 사용하려고 하다보니 문제가 더 어려워지고 복잡해졌다.
- 그리고 sorted 정렬 함수도 복잡하게 구현했지 않았을까 싶다...
'알고리즘_코딩테스트 > 이것이 코딩테스트다' 카테고리의 다른 글
[구현] 외벽 점검 (0) | 2021.12.15 |
---|---|
[구현] 치킨 배달 (0) | 2021.12.15 |
[구현] 뱀 (0) | 2021.12.13 |
[구현] 자물쇠와 열쇠 (0) | 2021.12.13 |
[구현] 문자열 압축 (0) | 2021.12.13 |