티스토리 뷰

문제출처 - https://programmers.co.kr/learn/courses/30/lessons/60061

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

틀린 풀이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

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함