티스토리 뷰
https://www.acmicpc.net/problem/12970
12970번: AB
첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.
www.acmicpc.net
백트랙킹으로 접근했을 때, 메모리/시간 모두 간신히 통과했던 문제입니다.
새로운 방식의 풀이에
- A의 갯수 + B의 갯수 = 전체 문자열의 길이 N
- 만들어야 하는 쌍의 갯수 K의 범위 : 0 ~ (A의 갯수)x(B의 갯수)
위 두 가지 성질을 이용해 그리디 기법으로 접근하여 적은 메모리와 빠른 시간에 문제를 해결할 수 있었습니다.
C++ 소스 코드
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k;
cin >> n >> k;
for(int a=0;a<=n;a++){
//a의 갯수 0~N개 for 문
int b= n-a; // a+b = N
// 가능한 쌍의 범위 : 0<= K <= a*b
if (a*b < k) continue;
//b의 왼쪽 끝부터 오른쪽 끝까지
vector<int> cnt(b+1);
for(int i=0;i<a;i++){
int x = min(b,k);
cnt[x]+=1;
// x 위치에 a를 한개 추가할 때마다 x개의 쌍이 생김
k-=x;
}
for(int i=b;i>=0;i--){
for(int j=0;j<cnt[i];j++){
//현재 위치에 A부터 채워나감
cout << 'A';
}
if (i>0){
cout << 'B';
}
}
cout << '\n';
return 0;
}
cout << -1 << '\n';
return 0;
}
'Algorithm > 알고리즘 문제풀이' 카테고리의 다른 글
BOJ) 12904 - A와 B (0) | 2020.06.24 |
---|---|
BOJ) 10986 - 나머지 합 (0) | 2020.06.23 |
프로그래머스) Lv4 - 지형 이동 (0) | 2020.06.19 |
BOJ) 2008 - 사다리 게임 (0) | 2020.06.18 |
프로그래머스) Lv2 - 기능개발 (0) | 2020.06.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 코코아팟
- Swift unowned
- rxswift6
- 안드로이드
- 백준온라인저지
- UIHostingController
- boj
- ios
- Swift
- 백준
- disposeBag
- Reactivex
- 알고리즘
- coreml
- rxswift
- blendshape
- 카카오인턴십
- cocoapods
- ARKit
- Lottie
- blendshapes
- Kotlin
- GraphDB
- C++
- 프로그래머스
- SWEA
- infallible
- Swift weak
- DispatchQueue
- SwiftUI
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함