국문과 유목민

[구현] 기둥과 보 설치 본문

알고리즘_코딩테스트/이것이 코딩테스트다

[구현] 기둥과 보 설치

논곰 2021. 12. 13. 23:04
"이것이 코딩테스트다(나동빈 저)"에서 나온 문제에 대한 코드를 다루고 있습니다.
문제에 대한 구체적인 설명과 조건 등은 책을 참고해주시기 바랍니다.

소요시간: 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