※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 26740번 문제인 Nawiasowania이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/26740
26740번: Nawiasowania
Poprawnym nawiasowaniem nazywamy napis, który może powstać z wyrażenia arytmetycznego przez usunięcie wszystkiego poza znakami nawiasów. Na przykład napis ()(()) jest poprawnym nawiasowaniem, ponieważ mógł powstać na przykład z wyrażenia (2 +
www.acmicpc.net
()가 k개 이어진 문자열의 올바른 부분괄호문자열의 개수는 k*(k+1)/2와 같음을 관찰하자.
또한 두 올바른 부분괄호문자열의 개수가 a1, a2인 두 괄호문자열 s1, s2에 대하여 s1 + ')' + s2 꼴의 문자열의 올바른 부분괄호문자열의 개수는 a1+a2가 됨을 관찰하자.
위 두 성질을 이용하면 N보다 작거나 같은 수 중 가장 큰 k(k+1)/2값을 찾아 ()를 그 개수만큼 출력하고 ')'를 출력한 뒤 N-k(k+1)/2에 대해 이 과정을 반복하는 것으로 문제를 해결할 수 있다.
각 N에 대하여 첫 단계에 작성하게 되는 ()가 이어진 문자열의 길이는 sqrt(N)에 비례함을 관찰하자. 즉, 이렇게 생성한 문자열의 길이가 10만을 넘지 않을 것임을 관찰하자. (자세한 증명은 단순계산이므로 생략한다.)
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int N;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N;
while (N) {
int cnt = 1;
while (N >= cnt) cout << "()", N -= cnt++;
cout << ')';
}
}
'BOJ' 카테고리의 다른 글
[BOJ 2295 // C++] 세 수의 합 (0) | 2023.07.25 |
---|---|
[BOJ 17265 // C++] 나의 인생에는 수학과 함께 (0) | 2023.07.24 |
[BOJ 21772 // C++] 가희의 고구마 먹방 (0) | 2023.07.22 |
[BOJ 26640 // C++] Palindrom (0) | 2023.07.21 |
[BOJ 26660 // C++] A + B (0) | 2023.07.20 |