deo2kim
맞왜틀
deo2kim
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS
      • Algorithm
      • Data Structure
      • Network
      • DB
      • OS
    • Algorithm Problem
      • Python
      • JavaScript
    • Programming language
      • Python
      • JavaScript
    • Tool
      • Jquery
      • React
    • 개발
    • Infra

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

반응형
hELLO · Designed By 정상우.
deo2kim
Algorithm Problem/Python

[python] 백준 - 15684. 사다리 조작

[python] 백준 - 15684. 사다리 조작
Algorithm Problem/Python

[python] 백준 - 15684. 사다리 조작

2020. 5. 28. 23:46
반응형

문제 해결

부르트포스

1. 크게 다리를 놓는 것과 사다리를 타는 것으로 나눈다.

2. 먼저 시작점은 (1, 1)이고 out of index 문제를 미리 방지하기 위해 배열을 적당히 넉넉하게 만들어준다.

3. 사다리를 0개 ~ 3개 짓는 경우를 만들어주고, 완전탐색으로 모든 경우의 수를 다 구해준다.

4. 그때 그때 마다 사다리타기를 해 결과 조건에 부합하는 지 확인해준다.

 

-> 파이썬은 항상 시간초과 문제와의 싸움이다. 이번에도 pypy로 통과했다.

오늘은 시작부터 힘들었다. 문제 이해부터 예제 이해까지.... 하지만 역시 이웃님이 해결해줬다. 🔨

 

소스 코드

# 사다리 타기
def down():
    # 1,1 부터 시작!
    for start in range(1, N+1):
        y = start  # 시작점 인덱스를 저장
        for i in range(1, H+1):
            # 내려갔는데 1을 만나면 오른쪽으로
            if ladder[i][y] == 1:
                y += 1
            # 그게아니라 왼쪽을 봤는데 1을 봤으면 왼쪽으로
            elif ladder[i][y-1] == 1:
                y -= 1

        else:
            # 도착점이 시작점과 같지 않으면 False
            if start != y:
                return False
    # 같으면 True
    else:
        return True


# 사다리 짓기
def build(idx, tmp_cnt):
    global result
    if result > -1:
        return

    # 사다리를 원하는 갯수만큼 지었을 때
    if tmp_cnt == cnt:
        # 사다리 타기를 해서 True면 끝!
        if down():
            result = cnt
        return

    for i in range(idx, H+1):  # idx~H+1 : 다시 맨위부터 사다리를 만드는 것을 방지!
        for j in range(1, N):  # 1~N : 사다리는 항상 왼쪽에 만들기 때문에 N+1이 아닌 N까지!
            # 결과를 얻었을 때 모든 함수를 바로바로 리턴하려고
            # 혹시나 시간 짧아질까 넣어둠
            if result > -1:
                return
            # 현재위치, 왼쪽, 오른쪽에 사다리가 없으면 사다리를 만들자
            if ladder[i][j] == 0 and ladder[i][j-1] == 0 and ladder[i][j+1] == 0:
                ladder[i][j] = 1  # 사다리 만들고
                build(i, tmp_cnt+1)  # 다음으로 넘어간다음 나와서
                ladder[i][j] = 0  # 사다리 없애고

    return


N, M, H = map(int, input().split())  # 전체 세로줄, 가로 그어져 있는 줄, 전체 가로줄
ladder = [[0]*(N+2) for _ in range(H+1)]  # 1,1부터 시작하므로, 양옆에 0으로 채우고, 맨위에도 0으로 채운다.

# (건너는)가로줄 다리의 왼쪽을 1로 둔다 | 사다리를 내려올 때, 내려온 지점과 그 지점의 왼쪽을 항상 탐색 할 것
for _ in range(M):
    x, y = map(int, input().split())
    ladder[x][y] = 1

# 사다리를 3개까지 둬도 정답이 없으면 -1
result = -1
for cnt in range(4):
    build(1, 0)
    # 정답을 찾으면 break!
    if result != -1:
        break

print(result)

 

출처: BACKJOON ONLINE JUDGE

문제: https://www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

www.acmicpc.net

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm Problem > Python' 카테고리의 다른 글

[python] 백준 - 2606. 바이러스  (0) 2020.06.01
[python] 백준 - 15683. 감시  (0) 2020.05.29
[python] 백준 - 1753. 최단경로  (0) 2020.05.27
[python] 백준 - 1759. 암호 만들기  (0) 2020.05.27
[python] 백준 - 7568. 덩치  (0) 2020.05.25
    'Algorithm Problem/Python' 카테고리의 다른 글
    • [python] 백준 - 2606. 바이러스
    • [python] 백준 - 15683. 감시
    • [python] 백준 - 1753. 최단경로
    • [python] 백준 - 1759. 암호 만들기
    deo2kim
    deo2kim
    코딩 기록하기

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.