본문 바로가기

Algorithm/BOJ

[BOJ] 2529. 부등호

https://www.acmicpc.net/problem/2529

 

2529번: 부등호

두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시

www.acmicpc.net

 

 

1. 해결방법

완전탐색 백트래킹을 이용하여 문제를 해결하였다.
아이디어는 쉽지만 코드로 옮기는 과정에서 3시간 정도 잡아 먹은 것 같다.. 역시 아직 알고리즘을 더 해야겠다.

각 숫자 0 ~ 9는 하나만 들어가야 하므로, 방문 여부 체크는 반드시 해주어야 하고 첫 번째 숫자는 부등호와 상관없이 s 문자열에 포함되어야 하는 부분을 신경 써주면 된다.

가장 중요한 부분은 부등호에 맞게 큰 값과 작은 값이 들어가야 하는 분기를 다르게 설정해주어야 한다.
본인은 '<' 부등호 일 때, s[-1] 문자열의 가장 뒷 부분의 문자와 해당 숫자를 비교해서 부등호에 맞는 숫자를 s 문자열에 추가시키는 방향으로 구현하였다.

 

 

2. 정답코드

import sys
input = sys.stdin.readline


k = int(input())
strings = list(map(str, input().split()))


# dfs
def dfs(idx, s, s_number):
    global result, max_v, min_v

    # 종료 지점
    if idx > k:
        max_v = max(str(max_v), s)
        min_v = min(str(min_v), s)
        return

    for i in range(10):
        if chk[i] == False:
            if idx == 0:
                chk[i] = True
                dfs(idx + 1, s + str(i), s_number)
                chk[i] = False
            elif idx > 0:
                if strings[s_number] == '<' and s[-1] < str(i):
                    chk[i] = True
                    dfs(idx + 1, s + str(i), s_number + 1)
                    chk[i] = False
                elif strings[s_number] == '>' and s[-1] > str(i):
                    chk[i] = True
                    dfs(idx + 1, s + str(i), s_number + 1)
                    chk[i] = False


# main
chk = [False] * (10)
max_v, min_v = -1e9, sys.maxsize

dfs(0, "", 0)
print(max_v)
print(min_v)

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 2580. 스도쿠  (0) 2022.10.08
[BOJ] 1987. 알파벳  (6) 2022.10.07
[BOJ] 10971. 외판원 순회 2  (0) 2022.10.05
[BOJ] 15686. 치킨 배달  (0) 2022.10.03
[BOJ] 1463. 1로 나누기  (0) 2022.09.28