일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 백준 #백준2217 #백준로프 #python
- 백준 #백준알고리즘 #알고리즘 #코딩테스트 #코딩테스트준비 #코테준비 #백준2110 #python #문제풀이
- 프로그래머스 #네트워크 #c++ #코딩테스트 #코테 #코테준비 #dfs
- 프로그래머스 #python #코딩테스트 #코테공부 #알고리즘 #dict
- 동
- 프로그래머스 #NULL 처리하기
- 카카오 #프로그래머스 #python #코딩테스트 #오픈채팅방
- 프로그래머스 #python #2021카카오 #카카오코테 #카카오인턴쉽
- 카카오 코테
- 백준 #이거다시풀기
- 프로그래머스 #sql #mysql #코딩테스트
- 그리디알고리즘 #그리디 #백준 #우선순위큐 #최소힙 #최대힙 #알고리즘 #코딩테스트 #python
- 프로그래머스 #c++ #코딩테스트
- Today
- Total
say repository
[백준] 2529 부등호 python (*) 본문
문제
두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시된 부등호 순서열 A가 다음과 같다고 하자.
A ⇒ < < < > < < > < >
부등호 기호 앞뒤에 넣을 수 있는 숫자는 0부터 9까지의 정수이며 선택된 숫자는 모두 달라야 한다. 아래는 부등호 순서열 A를 만족시키는 한 예이다.
3 < 4 < 5 < 6 > 1 < 2 < 8 > 7 < 9 > 0
이 상황에서 부등호 기호를 제거한 뒤, 숫자를 모두 붙이면 하나의 수를 만들 수 있는데 이 수를 주어진 부등호 관계를 만족시키는 정수라고 한다. 그런데 주어진 부등호 관계를 만족하는 정수는 하나 이상 존재한다. 예를 들어 3456128790 뿐만 아니라 5689023174도 아래와 같이 부등호 관계 A를 만족시킨다.
5 < 6 < 8 < 9 > 0 < 2 < 3 > 1 < 7 > 4
여러분은 제시된 k개의 부등호 순서를 만족하는 (k+1)자리의 정수 중에서 최댓값과 최솟값을 찾아야 한다. 앞서 설명한 대로 각 부등호의 앞뒤에 들어가는 숫자는 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }중에서 선택해야 하며 선택된 숫자는 모두 달라야 한다.
입력
첫 줄에 부등호 문자의 개수를 나타내는 정수 k가 주어진다. 그 다음 줄에는 k개의 부등호 기호가 하나의 공백을 두고 한 줄에 모두 제시된다. k의 범위는 2 ≤ k ≤ 9 이다.
출력
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.
코드
k = int(input())
oper = input().split()
visited = [0]*10
r_max, r_min = "",""
def giveAnswer(op,i,j):
if op==">":
return i>j
else:
return i<j
return
def dfs(cnt,s):
global r_max,r_min
if cnt==k+1:
if len(r_min)==0:
r_min = s
else:
r_max = s
return
for i in range(10):
if not visited[i]:
if cnt==0 or giveAnswer(oper[cnt-1],s[-1],str(i)):
visited[i] = 1
dfs(cnt+1, s+str(i))
visited[i] = 0
dfs(0,"")
print(r_max)
print(r_min)
풀이
1) min, max 문자열 따로
2) 0~9까지 숫자 중복되면 안되니까 방문 체크 visited 생각남
3) dfs 방식으로 재귀함수 사용하자.
4) 글자수가 k+1이면 종료해야 하니까 글자 수 관리
5) 입력받은 부등호랑 부등호 앞뒤로 넣을 숫자 비교해야 함 ( 부등호 조건 만족해야 함) -> 따로 관리 (함수 필요)
dfs(cnt, s) 재귀 함수를 사용하면 된다.
cnt가 0부터 k+1까지 문자열을 입력받는다.
0부터 시작하니까 처음 입력된 문자열이 최솟값, 맨 나중이 최댓값이다. ( 첫 번째가 9일 때까지 반복문 돌면 최댓값이다.)
문제를 보고 이러한 조건들을 만족해야 풀 수 있다고 생각이 들었고 풀 수 있을 줄 알았다^^..
ㅎㅇㅌ 더 열심히 하자~!~!~! ㅠㅠㅠㅠㅠㅠ 아 어려워....
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 10828 스택 python (0) | 2022.02.16 |
---|---|
[백준] 10814 나이순 정렬 python (0) | 2022.02.15 |
[백준] 10867 중복 빼고 정렬하기 python (0) | 2022.02.15 |
[백준] 11651 좌표 정렬하기2 python (0) | 2022.02.15 |
[백준] 2309 일곱 난쟁이 python (0) | 2022.02.12 |