-
백준(BOJ) 2529번 부등호알고리즘 풀이/백준(Boj) 2019. 7. 2. 01:43
문제: https://www.acmicpc.net/problem/2529
입력
첫 줄에 부등호 문자의 개수를 나타내는 정수 k가 주어진다. 그 다음 줄에는 k개의 부등호 기호가 하나의 공백을 두고 한 줄에 모두 제시된다. k의 범위는 2 ≤ k ≤ 9 이다.
출력
여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.
나의 풀이:
완전탐색으로 풀어보았다.
부등호 2개라면 2개를 기준으로 처음 0~9 고르고 / 부등호 / (앞에 부등호 보고) 0~9 고르고 / 부등호 / (앞에 부등호 보고) 0~9 고르고 를 결정하였다.
완전 탐색
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
int k;
char sign[10];
string ans;
vector<string> result;
bool visited[10];
void solve(string ans, int cnt)
{
if (cnt == k) { // cnt가 k가 됬다면 만족한 답을 result 벡터에 넣어준다.
result.push_back(ans);
return;
}
if (sign[cnt] == '<') // 부등호가 < 라면
{
int temp = ans[cnt] - '0'; // 바로 전 숫자를 temp에 기억해 둔 후에
for (int i = 0; i < 10; ++i) {
if (temp >= i) // temp보다 i가 작다면 continue 한다.
continue;
if (!visited[i]) { //temp보다 클 경우 아직 쓰지않은 숫자라면
visited[i] = true;
ans += (i + '0');
solve(ans, cnt + 1); // 숫자를 추가해주고 다시 재귀 함수 돌린다.
visited[i] = false;
ans.pop_back();
}
}
}
else
{
int temp = ans[cnt] - '0';
for (int i = 0; i < 10; ++i) {
if (temp <= i)
continue;
if (!visited[i]) {
visited[i] = true;
ans += (i + '0');
solve(ans, cnt + 1);
visited[i] = false;
ans.pop_back();
}
}
}
}
int main()
{
cin >> k;
for (int i = 0; i < k; ++i)
{
cin >> sign[i];
}
for (int i = 0; i < 10; ++i)
{
if (!visited[i]) {
visited[i] = true;
ans += (i + '0');
solve(ans, 0); // 0부터 ~ 9까지 한 숫자를 먼저 고른다.
visited[i] = false;
ans.pop_back();
}
}
cout << result[result.size() - 1] << endl; //0부터 완전탐색으로 해왔기에 정렬이 되어있다.
cout << result[0] << endl;
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 1182번 부분수열의 합 (0) 2019.07.05 백준(BOJ) 11048번 이동하기 (0) 2019.07.03 백준(BOJ) 1946번: 신입 사원 (0) 2019.06.28 백준(BOJ) 10815번: 숫자 카드 (0) 2019.06.28 백준(BOJ) 2583번: 영역 구하기 (0) 2019.06.27