김호쭈
DevForYou
김호쭈
전체 방문자
오늘
어제
  • 분류 전체보기 (321)
    • • 데이터베이스(DB) (9)
      • __SQL__ (9)
    • •알고리즘(Algorithm ) (117)
      • 문제풀이 (99)
      • 스터디 (14)
      • 알고리즘 팁 (4)
    • •Compter Science (57)
      • Operating System (25)
      • Computer Network (1)
      • Computer Vision (16)
      • Artificial Intelligence (14)
      • Software Technology (1)
    • • 독서 (36)
      • Design Pattern (24)
      • 객체지향의 사실과 오해 (1)
      • Object Oriented Software En.. (11)
    • • 개발 (26)
      • React (3)
      • node.js (6)
      • Django (11)
      • Spring boot (6)
    • • 개발Tip (4)
      • GitHub (0)
    • •프로젝트 (2)
      • 물물 (2)
    • •App (54)
      • 안드로이드 with Kotlin (50)
      • 코틀린(Kotiln) (4)
    • •회고 (8)
    • •취준일기 (3)
    • • 기타 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Remote저장소
  • KMU_WINK
  • GitHubDesktop
  • local저장소
  • 로컬저장소
  • 원격저장소
  • 깃허브데스크탑
  • ㄱ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
김호쭈

DevForYou

[알고리즘] BFS를 이용하여 최단거리를 출력해야할때 with predecesso(프로시져)
•알고리즘(Algorithm )/알고리즘 팁

[알고리즘] BFS를 이용하여 최단거리를 출력해야할때 with predecesso(프로시져)

2023. 2. 2. 17:17

# 발단

 

9019번: DSLR

네 개의 명령어 D, S, L, R 을 이용하는 간단한 계산기가 있다. 이 계산기에는 레지스터가 하나 있는데, 이 레지스터에는 0 이상 10,000 미만의 십진수를 저장할 수 있다. 각 명령어는 이 레지스터에

www.acmicpc.net

 BFS문제는 간선에 가중치가 없는 경우 그래프적으로 해석하면 최단거리를 구할 수 있다. 왜냐하면 노드의 방문을 큐로 관리하기 때문에 넓이우선탐색을 하고 이 넓이는 하나의 turn이 될 수 있다. 그 turn에서 목표지점을 발견했다면 그것이 최단거리이다.

 몇몇 BFS문제를 풀었을때, 이러한 최단거리까지 총 몇번의 거쳐서 가는가를 구하는 응용 문제들( ex. 며칠이 걸리나? like 토마토 )은 프로시져를 활용하여 풀었다. 즉 큐에 방문할 당시의 단계+1을 해주고 도착점에서 그 값을 구하도록 했다.

# 토마토 문제
mNext = (next[0],next[1],next[2], cur[3]+1) # 마지막 인자는 현재까지의 방문일에 +1 을 해준다

 

## DSLR에서는?

 근데 DSLR에서는 거쳐온 경로를 구해야했다, 즉 LLDDD와 같은 값을 구해야 했다. 토마토의 방식과 똑같이 하면 됐지만, 그렇게 풀 생각을 안하고 아래와 같이 이전의 위치를 기억하게 하는 dict을 만들고 재귀적으로 뒤에서부터 앞으로 돌아가게 만들었다.

ddict = defaultdict(list)

def backward(ddict,cur,start) :
  while True :
    if ddict[cur][0] == start :
      print(ddict[cur][1], end="")
      break
    print(ddict[cur][1],end="")
    cur = ddict[cur][0]

일단 이 풀이는 틀렸다.

  • 앞에서부터 뒤의 출력결과가 나와야하는데, 뒤에서부터 앞의 출력결과를 구해버렸다. ( 이건 코드를 바꾸면 되긴 하지만..)
  • 프로시져를 활용하면 쓰지 않아도 되는 메모리를 낭비하게 된다
  • 시간도 낭비한다

 

# 결론

def solve() :
  cur, target = map(int, sys.stdin.readline().strip().split())
  dq = deque()
  dq.append((cur,""))
  commands = ["D","S","L","R"]
  visit = [False for i in range(10_000)]

  while cur != target :
    cur = dq.popleft()
    for command in commands :
      next = DSLR(command, cur[0])
      if not visit[next] :
        dq.append((next,cur[1]+command)) # <---- 이렇게 활용
        visit[next] = True
        if next == target:
          print(cur[1]+command)
          return

여튼 이것도 프로시져방식을 이용하여 그냥 string을 하나씩 더해주면 된다. 괜히 헛고생했다.

저작자표시 (새창열림)

'•알고리즘(Algorithm ) > 알고리즘 팁' 카테고리의 다른 글

[알고리즘] queue 보다는 deque를 사용하자  (1) 2023.01.28
[백준풀때 유용한 파이썬 팁] itertools을 이용해 조합(combinations)과 순열(permutations), 중복순열(product) 사용하기  (0) 2022.11.02
[백준풀때 유용한 파이썬 팁] zfill(), rjust(), ljust() 이용하여 빈 곳을 0으로 채우기  (0) 2022.11.01
    '•알고리즘(Algorithm )/알고리즘 팁' 카테고리의 다른 글
    • [알고리즘] queue 보다는 deque를 사용하자
    • [백준풀때 유용한 파이썬 팁] itertools을 이용해 조합(combinations)과 순열(permutations), 중복순열(product) 사용하기
    • [백준풀때 유용한 파이썬 팁] zfill(), rjust(), ljust() 이용하여 빈 곳을 0으로 채우기
    김호쭈
    김호쭈
    공부하고 정리하고 기록하기

    티스토리툴바