stack2

SOYOUNG·2021년 4월 20일
0

알고리즘 기본

목록 보기
5/5

swea4874 Forth

for tc in range(1, int(input())+1):
    lst = input().split()
    stk = []
    ans = ''
    for i in range(len(lst)):
        if lst[i].isdigit():
            stk.append(lst[i])
        elif lst[i] == '+':
            if len(stk) >1:
                a = int(stk.pop())
                b = int(stk.pop())
                stk.append(a+b)
            else:
                ans = 'error'
                break

        elif lst[i] == '-':
            if len(stk) >1:
                a = int(stk.pop())
                b = int(stk.pop())
                stk.append(b-a)
            else:
                ans = 'error'
                break
        elif lst[i] == '*':
            if len(stk) >1:
                a = int(stk.pop())
                b = int(stk.pop())
                stk.append(a*b)
            else:
                ans = 'error'
                break
        elif lst[i] == '/':
            if len(stk) >1:
                a = int(stk.pop())
                b = int(stk.pop())
                stk.append(b//a)
            else:
                ans = 'error'
                break

        elif lst[i] == '.':
            if len(stk) > 1:
                ans = 'error'
            else:
                ans = stk[-1]
    print('#{} {}'.format(tc, ans))

swea4875 미로

def solve(r, c):
    global ans
    visited.append((r, c))
    if miro[r][c] == 3:
        ans = 1
        return


    dr = [-1, 0, 1, 0]
    dc = [0, 1, 0, -1]
    for i in range(4):
        nr = r + dr[i]
        nc = c + dc[i]
        if 0 <= nr < N and 0 <= nc < N and (nr, nc) not in visited and miro[nr][nc] != 1:
            solve(nr, nc)


for tc in range(1, int(input()) + 1):
    N = int(input())
    miro = [list(map(int, input())) for _ in range(N)]
    visited = []
    ans = 0
    for i in range(N):
        for j in range(N):
            if miro[i][j] == 2:
                start = (i, j)
                solve(start[0], start[1])

    print('#{} {}'.format(tc, ans))

swea4881 배열 최소합

def solve(row, total):
    global minn
    if row == N: # 끝까지 돌았을 때
        if total < minn:
            minn = total
            return minn
    if total >= minn: # 가지치기
        return
    for i in range(N):
        if col_chk[i] == 0:
            col_chk[i] = 1 # 방문했음 표시
            solve(row+1, total + arr[row][i])
            col_chk[i] = 0



for tc in range(1, int(input()) + 1):
    N = int(input())
    arr = [list(map(int, input().split())) for _ in range(N)]
    col_chk = [0] * N
    minn = 987654321
    solve(0, 0)
    print('#{} {}'.format(tc, minn))

swea1223 계산기2

for tc in range(1, 11):
    N = int(input())
    formula = input()
    result = ''
    stk = []
    # 일단 후위 계산법으로 만들기
    for s in formula:
        if s.isdigit(): # 숫자면 result 에 바로 넣기
            result += s
        else:
            if s == '+':
                if len(stk) == 0: # 스택이 비어있으면 스택에 넣기
                    stk.append(s)
                else: # 스택이 비어있지 않으면
                    if stk[-1] == '+' or stk[-1] == '*':
                        result += stk.pop()
                    stk.append(s)

            elif s == '*':
                if len(stk) == 0 or stk[-1] == '+':
                    stk.append(s)
                else:
                    if stk[-1] == '*':
                        result += stk.pop()

                    stk.append(s)

    while stk: # 남은거 마지막에 넣어줘
        result += stk.pop()

    # 후위 연산법 구한거 계산하기
    stack_cal = []
    for i in range(len(result)):
        if result[i].isdigit(): # 숫자이면
            stack_cal.append(result[i]) # 바로 리스트에 넣기
        elif result[i] == '+':
            a = int(stack_cal.pop())
            b = int(stack_cal.pop()) 
            stack_cal.append(a+b) # 스택_칼 에 있던거 뒤에 두개 팝 해서 연산해서 넣기
        elif result[i] == '*':
            a = int(stack_cal.pop())
            b = int(stack_cal.pop()) 
            stack_cal.append(a*b)

    print('#{}'.format(tc), *stack_cal)

swea 1224 계산기3

for tc in range(1, 11):
    length = int(input())
    string = input()
    stk = []
    ans = ''
    for i in range(len(string)):
        if string[i].isdigit():  # 숫자이면 바로 ans 에 집어넣기
            ans += string[i]
        else:  # 숫자가 아니면 stk에 하나씩 넣기
            if string[i] == '(':  # 여는 괄호는 우선순위가 제일 낮으니까 일단 무조건 넣기
                stk.append(string[i])

            if string[i] == '*':
                while len(stk) > 0 and (stk[-1] == '*'):  # 스텍 마지막에 * 없어질 때 까지 pop
                    ans += stk.pop()  # 해서 ans 에 넣기
                stk.append(string[i])  # 다 뽑고 우선순위 맞춘거니까 이제 stk에 넣기

            elif string[i] == '+':
                while len(stk) > 0 and (stk[-1] != '('):  # 여는 괄호 남을때 까지 빼기
                    ans += stk.pop()
                stk.append(string[i])

            elif string[i] == ')':
                while stk and stk[-1] != '(':  # 여는 괄호만 남을때 까지 pop
                    ans += stk.pop()
                # stk.append(string[i]) # ')'얘는 안넣어주니까
                stk.pop()  # 이제 여는괄호도 빼기

    # 마지막에 남은것 있으면 pop해서 ans 에 붙여줘야해
    while stk:
        ans += stk.pop()

    total = []
    for i in range(len(ans)):
        if ans[i].isdigit():
            total.append(ans[i])
        elif ans[i] == '+':
            a = int(total.pop())
            b = int(total.pop())
            total.append(a+b)
        elif ans[i] == '*':
            a = int(total.pop())
            b = int(total.pop())
            total.append(a*b)

    print('#{}'.format(tc), total[-1])

swea4615 재미있는 오셀로게임

def solve(c, r, color):
    # 상 우상 우 우하 하 좌하 좌 좌상
    dr =[-1, -1, 0, 1, 1, 1, 0, -1]
    dc = [0, 1, 1, 1, 0, -1, -1, -1]
    pan[r][c] = color
    for i in range(8):
        nr = r
        nc = c
        while True:
            nr += dr[i]
            nc += dc[i]
            if nr <= 0 or nr > N or nc <= 0 or nc > N:
                break
            if pan[nr][nc] == 0:
                break
            if pan[nr][nc] == color:
                while not (nr == r and nc == c):
                    nr -= dr[i]
                    nc -= dc[i]
                    pan[nr][nc] = color
                break


T = int(input())
for tc in range(1, T+1):
    N, M = map(int, input().split())
    pan = [[0] * (N+1) for _ in range(N+1)]
    # 일단 초기값 배정하고
    pan[N//2][N//2] = 2
    pan[N//2][N//2+1] = 1
    pan[N//2+1][N//2] = 1
    pan[N//2+1][N//2+1] = 2
    for i in range(M):
        c, r, color = map(int, input().split())
        solve(c, r, color)
    
    cnt_b = 0
    cnt_w = 0
    for i in range(N+1):
        for j in range(N+1):
            if pan[i][j] == 1:
                cnt_b += 1
            elif pan[i][j] == 2:
                cnt_w += 1
    print('#{} {} {}'.format(tc, cnt_b, cnt_w))

swea2805 농작물 수확하기

(얘는 분류하자면 list2)

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

    # 다 더하고 네 모서리 빼기
    total = 0
    for i in range(N):
        for j in range(N):
            total += farm[i][j]

    # 좌상 모서리쪽
    m1 = 0
    for i in range(N//2):
        for j in range(N//2-i):
            m1 += farm[i][j]

    # 우상 모서리쪽
    m2 = 0
    for i in range(N//2):
        for j in range(N//2+i+1, N):
            m2 += farm[i][j]
    # 좌하 모서리쪽
    m3 = 0
    for i in range(N//2+1, N):
        for j in range(i-N//2):
            m3 += farm[i][j]
    # 우하 모서리쪽
    m4 = 0
    for i in range(N//2+1, N):
        for j in range(N-(i-N//2), N):
            m4 += farm[i][j]


    print('#{} {}'.format(tc, total - (m1 + m2 + m3 + m4)))

swea1974 스도쿠 검증

# 좀 무식하게 풀었다 ㅎㅎ
T = int(input())
for tc in range(1, T+1):
    sdok = [list(map(int, input().split())) for _ in range(9)]

    # 가로탐색 # 체크들 세개 다 합친거가 27 이어야 맞는 스도쿠
    chk1 = 0
    for i in range(9):
        summ = 0
        for j in range(9):
            summ += sdok[i][j]

        if summ == 45:
            chk1 += 1

    # 세로탐색
    chk2 = 0
    for j in range(9):
        summ = 0
        for i in range(9):
            summ += sdok[i][j]

        if summ == 45:
            chk2 += 1
    # 작은 사각형들
    chk3 = 0
    s = 0
    for i in range(3):
        for j in range(3):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(3, 6):
        for j in range(3):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(6, 9):
        for j in range(3):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(3):
        for j in range(3, 6):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(3, 6):
        for j in range(3, 6):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(6, 9):
        for j in range(3, 6):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1
    s = 0
    for i in range(3):
        for j in range(6, 9):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(3, 6):
        for j in range(6, 9):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    s = 0
    for i in range(6, 9):
        for j in range(6, 9):
            s += sdok[i][j]
    if s == 45:
        chk3 += 1

    if chk3 + chk2 + chk1 == 27:
        answer = 1
    else:
        answer = 0

    print('#{} {}'.format(tc, answer))
profile
개발자 꿈나무

0개의 댓글