해리의 데브로그

(SW 문제해결 기본 - Stack2) SWEA 4881 - 배열 최소 합

|

문제

  • SWEA 4880 - [S/W 문제해결 기본] Stack2 -배열 최소 합
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드

def MyCalc(y):
    global sub_result, result

    if result < sub_result:
        return

    if y == N:
        if sub_result < result:
            result = sub_result
        return

    for x in range(N):
        if not visited[x]:
            visited[x] = True
            sub_result += lst[y][x]
            MyCalc(y+1)
            visited[x] = False
            sub_result -= lst[y][x]


TC = int(input())
for tc in range(1, TC+1):
    N = int(input())
    lst = [list(map(int, input().split())) for _ in range(N)]
    visited = [0] * N
    sub_result, result = 0, 987654321
    MyCalc(0)

    print(f'#{tc} {result}')
  • backtracking 관련하여 풀었던 첫번째 문제였다. DFS와 상당부분 유사하나, 경로 탐색후 return 조건이 만족될 시, visited[x] = False & sub_result -= lst[y][x] 처럼 방문했던 경로나 값을 초기화 해주는 부분이 많이 달랐다. 이부분은 많은 연습이 필요할 듯 하다.

(SW 문제해결 기본 - Stack2) SWEA 4880 - 토너먼트 카드게임

|

문제

  • SWEA 4880 - [S/W 문제해결 기본] Stack2 - 토너먼트 카드게임
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드

def win(x, y):
    if (lst[x-1] == 1 and lst[y-1] == 3) or (lst[x-1] == 1 and lst[y-1] == 1):
        return x
    elif (lst[x-1] == 2 and lst[y-1] == 1) or (lst[x-1] == 2 and lst[y-1] == 2):
        return x
    elif (lst[x-1] == 3 and lst[y-1] == 2) or (lst[x-1] == 3 and lst[y-1] == 3):
        return x
    return y

def match(start, end):
    if start == end:
        return start

    first_value = match(start, (start+end)//2)
    second_value = match((start+end)//2+1, end)
    return win(first_value, second_value)

TC = int(input())

for tc in range(1, TC+1):
    N = int(input())
    lst = list(map(int, input().split()))
    start = 1
    end = N
    print(f'#{tc} {match(start, end)}')
  • DFS & backtracking을 사용하여 함수를 구현하는데 상당한 어려움이 있었던 문제였다. 지금까지 접한 문제는 마치 트리의 형태 처럼 하위 개념으로 재귀를 호출하는 구조였는데, 이 문제는 그 개념을 반대로 생각하여 접근하는 문제다보니 많이 생소하였다.

(SW 문제해결 기본 - Stack2) SWEA 4875 - 미로

|

문제

  • SWEA 4875 - [파이썬 S/W 문제해결 기본 5일차] Stack2 - 미로
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드


def IsSafe(y,x):
    return 0<=y<N and 0<=x<N and (Maze[y][x] == 0 or Maze[y][x] == 3)

def DFS(start_y, start_x):
    global result

    if Maze[start_y][start_x] == 3:
        result = 1
        return

    visited.append((start_y, start_x))
    for dir in range(4):
        New_Y = start_y + dy[dir]
        New_X = start_x + dx[dir]
        if IsSafe(New_Y, New_X) and (New_Y, New_X) not in visited:
            DFS(New_Y, New_X)


TC = int(input())
for tc in range(1, TC+1):
    N = int(input())
    Maze = [list(map(int, input())) for _ in range(N)]

    for y in range(N):
        for x in range(N):
            if Maze[y][x] == 2:
                start_y, start_x = y,x

    #상, 하, 좌, 우
    dy = [-1, 1, 0, 0]
    dx = [0, 0, -1, 1]

    visited = []
    result = 0
    DFS(start_y, start_x)
    print('#%d %d'%(tc, result))

(SW 문제해결 기본 - Stack2) SWEA 4874 - Forth

|

문제

  • SWEA 4875 - [파이썬 S/W 문제해결 기본 5일차] Stack2 - Forth
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드

TC = int(input())

for tc in range(1, TC+1):
    Data = list(input().split())
    N = len(Data)
    stack = []
    flag = 0

    # 마침표는 제외하기 위해 N-1까지 반복
    for i in range(N-1):  
        
        #숫자인 경우, stack에 append
        if Data[i].isdigit():
            stack.append(Data[i])

        else:
            try:  # 후위표기 계산
                num2, num1 = int(stack.pop()), int(stack.pop())

                if Data[i] == "+": result = num1 + num2
                elif Data[i] == "-": result = num1 - num2
                elif Data[i] == "/": result = num1 // num2
                elif Data[i] == "*": result = num1 * num2

                stack.append(str(result))

            except: #에러 발생 예외 처리 예) 숫자 + 연산자 + 연산자
                flag = 987654321

    #예외처리 조건 (X) + Stack의 길이가 1인 경우(계산이 성공적인경우)
    if flag == 0 and len(stack) == 1:
        print(f'#{tc} {stack[0]}')

    #예외처리 조건 (O) + stack의 길이가 2이상인 경우 ex) 숫자만 입력된 경우
    elif flag == 987654321 or len(stack)>1:
        print(f'#{tc} error')

SWEA 1210 - Ladder1

|

문제

  • SWEA 1210 - Ladder1
  • 문제링크
  • 문제의 저작권은 SW Expert Academy에 있습니다.

나의 코드

def IsSafe(y, x):
    return 0<=y<100 and 0<=x<100 and Ladder[y][x] == 1

def DFS(y, x):
    global result
    visited.append((y, x))

    if y == 0:
        result = x
        return

    for dir in range(3):
        NewY = y+dy[dir]
        NewX = x+dx[dir]
        if IsSafe(NewY, NewX) and not (NewY, NewX) in visited:
            return DFS(NewY, NewX)

for tc in range(1, 11):
    tc = int(input())
    Ladder = [list(map(int, input().split())) for _ in range(100)]

    start_y = 99
    start_x = Ladder[99].index(2)

    dy = [0, 0, -1]
    dx = [-1, 1, 0]

    result = 0
    visited = []
    DFS(start_y, start_x)
    print('#%d %d'%(tc, result))