2020. 10. 2. 23:57ㆍPS/BaekJoon Practice
문제는 3문제였고 자기 전에 1시간 정도 연습을 진행했다.
올솔 ㅎ
1. 한 줄로 서기 (Silver 2)
1138번: 한 줄로 서기
첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다 �
www.acmicpc.net
N<=10이므로 누가봐도 백트래킹이다.
저런 문제는 빠르게 머리를 밀어주자.
#include <bits/stdc++.h>
#define MEM 155
#define sanic ios_base::sync_with_stdio(0)
using namespace std;
typedef long long ll;
const ll MOD = 1e9+7;
ll n,m,k;
ll s[MEM];
ll a[MEM];
main() {
sanic;
cin >> n;
for(int i=0; i<n; i++)
cin >> s[i];
for(int i=0; i<n; i++)
a[i] = i+1;
do{
bool b=1;
for(int i=1; i<=n; i++){
ll cnt=0;
for(int j=0; j<n; j++){
if(a[j]==i) break;
if(a[j]>i) cnt++;
}
if(cnt!=s[i-1]) {b=0;break;}
}
if(b){
for(int i=0; i<n; i++)
cout << a[i] << ' ';
return 0;
}
}while(next_permutation(a,a+n));
}
2. 이모티콘 (Gold 5)
14226번: 이모티콘
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다. 영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만��
www.acmicpc.net
처음엔 dp 느낌을 많이 받았으나 3번을 처리를 못하는 단점이 있다.
그러므로 bfs+dp를 통해 최소 시간을 알아내자.
dp[i][j] = 입력한 이모티콘 길이가 i이고 클립보드에 있는 이모티콘 길이가 j일때 최소 입력 수
#include <bits/stdc++.h>
#define MEM 3055
#define sanic ios_base::sync_with_stdio(0)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
const ll MOD = 1e9+7;
ll n,m,k;
ll dp[MEM][MEM];
queue<pi> q;
main() {
sanic;
cin >> n;
q.push({1,0});
while(!q.empty()){
ll a=q.front().first,b=q.front().second;
q.pop();
//cout << a << ' ' << b << '\n';
if(a==n){
cout << dp[a][b];
return 0;
}
ll da[3]={a,a+b,a-1}, db[3]={a,b,b};
for(int i=0; i<3; i++){
if(0>=da[i] || da[i]>2*n) continue;
if(dp[da[i]][db[i]]) continue;
q.push({da[i],db[i]});
dp[da[i]][db[i]] = dp[a][b] + 1;
}
}
}
3. 저울 (Gold 3)
10159번: 저울
첫 줄에는 물건의 개수 N 이 주어지고, 둘째 줄에는 미리 측정된 물건 쌍의 개수 M이 주어진다. 단, 5 ≤ N ≤ 100 이고, 0 ≤ M ≤ 2,000이다. 다음 M개의 줄에 미리 측정된 비교 결과가 한 줄에 하나씩
www.acmicpc.net
골드 3 치고는 엄청 쉬운 문제이다.
N<=100이므로 그냥 단순한 플로이드 워셜을 이용하면 된다.
그냥 연결된 여부만 보므로 더 쉽다.
#include <bits/stdc++.h>
#define MEM 155
#define sanic ios_base::sync_with_stdio(0)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
const ll MOD = 1e9+7;
ll n,m,k;
ll dp[MEM][MEM];
queue<pi> q;
main() {
sanic;
cin >> n >> m;
for(int i=0; i<m; i++){
ll q1, q2;
cin >> q1 >> q2;
dp[q1][q2] = 1;
}
for(int i=1; i<=n; i++)
dp[i][i] = 1;
for(int k=1; k<=n; k++){
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
if(!dp[i][j] && dp[i][k] && dp[k][j])
dp[i][j] = 1;
}
}
}
for(int i=1; i<=n; i++){
ll cnt=0;
for(int j=1; j<=n; j++)
if(dp[i][j] || dp[j][i]) cnt++;
cout << n-cnt << '\n';
}
}
아슬아슬하게 11분 남기고 다 풀었다.
마지막 문제가 골드 3 치고는 아주 쉬웠으나 빠르게 푼 거 같아서 기쁘다.
실력이 느는 느낌이 많이 든다. 더 열심히 하자.
'PS > BaekJoon Practice' 카테고리의 다른 글
알고리즘 공부 : LIS (0) | 2020.12.25 |
---|---|
백준 재활 연습 - 1일차 (1) | 2020.11.18 |
백준 연습 #1 (1) | 2020.10.02 |