'정보올림피아드-KOI > 알고리즘 트레이닝' 카테고리의 다른 글
[이코테] 상하좌우 (0) | 2021.01.24 |
---|---|
[이코테] 이진탐색 (0) | 2020.12.14 |
[이코테] 선택정렬 (0) | 2020.12.14 |
[이코테] BFS 알고리즘 (0) | 2020.12.14 |
[이코테] DFS 알고리즘 with python & C++ (0) | 2020.12.14 |
[이코테] 상하좌우 (0) | 2021.01.24 |
---|---|
[이코테] 이진탐색 (0) | 2020.12.14 |
[이코테] 선택정렬 (0) | 2020.12.14 |
[이코테] BFS 알고리즘 (0) | 2020.12.14 |
[이코테] DFS 알고리즘 with python & C++ (0) | 2020.12.14 |
www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=2
[이코테] 1이 될때까지
www.youtube.com/watch?v=2zjoKjt97vQ&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=2 <추가 설명> n 23, k 3 target = (n//k)*k -> target 이 21이 된다. n - target을 하면 -> 2가되고 result에 2를 더한..
coding-gongboo.tistory.com
<추가 설명>
딱히 없네요.^^
그리디하게, 0,1 아니면 곱하기를 먼저 선택하면 되는 문제네용 ㅎㅎ
[이코테] BFS 알고리즘 (0) | 2020.12.14 |
---|---|
[이코테] DFS 알고리즘 with python & C++ (0) | 2020.12.14 |
[이코테] 1이 될때까지 (0) | 2020.12.14 |
힙 정렬 - Heap sort (0) | 2020.04.08 |
Priority_Queue 사용법 (0) | 2020.04.08 |
https://www.acmicpc.net/problem/15971
15971번: 두 로봇
2018년 강원도에서 새로운 동굴이 발견되었다. 이 동굴에는 총 N개의 넓은 방이 존재하며 좁은 통로로 서로 연결되어 있는 것으로 밝혀졌다. N개의 방은 1번부터 N번까지의 번호를 붙여 1번 방, 2번 방, …, N번 방으로 부른다. 통로는 정확히 N-1개가 발견되었는데, 각각 서로 다른 두 방 사이를 연결시켜 주며 중간에 다른 통로와 이어지는 경우는 없다고 한다. 또한 이 통로들을 이용하여 임의의 두 방 사이를 이동하는 것이 가능하며, 임의의 두 방 사
www.acmicpc.net
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
5 1 5
1 2 1
2 3 2
3 4 3
4 5 4
*/
int vi[100010],max1,tot;
vector <pair<int,int>> v[100010];
void dfs(int s, int e, int lmax, int l)
{
if(s==e) {
max1=lmax;
tot=l;
}
else{
vi[s]++;
for(int i=0;i<v[s].size();i++)
{
if(vi[v[s][i].first]==0)
{
int last=lmax>v[s][i].second?lmax:v[s][i].second;
dfs(v[s][i].first,e,last,l+v[s][i].second);
}
}
}
}
int main()
{
int r,r1,r2,i,s,e,d;
scanf("%d %d %d",&r,&r1,&r2);
for(i=1;i<r;i++)
{
scanf("%d %d %d",&s,&e,&d);
v[s].push_back(make_pair(e,d));
v[e].push_back(make_pair(s,d));
}
dfs(r1,r2,0,0);
printf("%d",tot-max1);
return 0;
}
백준 - 프린터 큐 : 1966번 (0) | 2020.04.26 |
---|---|
백준 - 로마 숫자 만들기 : 16922번 (0) | 2020.04.26 |
백준 : 두 박스 : 15973 (0) | 2020.03.31 |
[백준] 신기한 수 : 17618번 - 2019 정보올림피아드 2차 중등 1번문제 (0) | 2020.03.22 |
백준 : 개구리 점프: 17619번 - 2019 정보올림피아드 2차 중등 2번문제 (0) | 2020.03.17 |
https://www.acmicpc.net/problem/17618
17618번: 신기한 수
평소에 수에 대한 관심이 많은 아이인 민철이는 오늘도 노트에 연필로 수를 더하거나 빼거나 곱하거나 나눠보면서 시간을 보내고 있다. 그러다가 18이라는 수는 신기한 성질을 가진다는 것을 알아냈다. 18을 이루는 각 자릿수인 1과 8을 합한 9는 18의 약수가 된다. 민철이는 18과 같이 모든 자릿수의 합으로 나누어지는 수를 여러 개 더 찾아냈는데, 12, 21도 그런 신기한 수였다. 민철이는 이렇게 모든 자릿수의 합으로 나누어지는 수를 “신기한 수”라고 부
www.acmicpc.net
#include<bits/stdc++.h>
using namespace std;
int sum;
void Div_sum(int num)
{
if(num == 0)
{
return;
}
sum+=(num%10);
Div_sum(num/10);
}
int main(void)
{
int n;
int cnt=0;
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
Div_sum(i);
if((i%sum) == 0)
{
cnt++;
}
sum = 0;
}
printf("%d", cnt);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
int cnt = 0;
for(int i=1; i <=a; i ++)
{
int sum = 0;
int temp = i;
while(temp){
sum = sum + temp%10;
temp = temp / 10;
}
//cout << "== " << sum << "\n";
if( i % sum == 0) cnt ++;
}
cout << cnt;
}
백준 - 두 로봇 : 15971 (0) | 2020.03.31 |
---|---|
백준 : 두 박스 : 15973 (0) | 2020.03.31 |
백준 : 개구리 점프: 17619번 - 2019 정보올림피아드 2차 중등 2번문제 (0) | 2020.03.17 |
부분수열의 합 - 1182 (0) | 2020.03.01 |
랜선 자르기 1654번 (0) | 2020.03.01 |
https://www.acmicpc.net/problem/17619
17619번: 개구리 점프
첫 번째 줄에 통나무 개수 N과 질문의 개수 Q가 주어진다. 다음 N개의 줄에 각 통나무에 x1, x2, y의 세 정수 좌표가 주어진다. 주어진 통나무는 두 점 (x1, y)와 (x2, y)를 잇는 형태이다. (x1 < x2) 모든 좌표는 0이상 109이하이다. 통나무들은 주어진 순서대로 1번부터 번호가 붙어 있다. 서로 다른 두 통나무는 (끝점에서도) 만나지 않는다. 다음 Q개의 줄에 서로 다른 두 통나무의 번호가 주어진다. (1 ≤ N ≤ 100,00
www.acmicpc.net
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//2019 정올 2차 2번 문제 (중등)
struct s{
int a,b,pos;
};
bool compare(struct s x,struct s y)
{
//return x.a<y.a;
if(x.a<y.a)
return true;
return false;
}
int main()
{
int m,n,i,j,y,r1[1000000]={0,},r2[1000000]={0,},max1,k=0,t=0,z=0,flag=0;
int g2[1000000];
struct s log[1000000];
scanf("%d %d",&m,&n);
for(i=0;i<m;i++){
scanf("%d %d %d",&log[i].a,&log[i].b,&y);
log[i].pos=i+1;
g2[log[i].pos] = log[i].pos;
}
for(i=0;i<n;i++)
scanf("%d %d",&r1[i],&r2[i]);
sort(log,log+m,compare);
while(1)
{
max1=log[t].b;
int group = g2[log[t].pos];
for(i=t;i<m-1;i++)
{
if(log[i+1].a<=max1)
{
g2[log[i+1].pos] = group;
if(log[i+1].b>max1)
max1=log[i+1].b;
}
else
break;
}
t=i+1;
k++;
z=0;
if(t>=m)
break;
}
for(t=0;t<n;t++)
{
if(g2[r1[t]] == g2[r2[t]]) puts("1");
else puts("0");
}
return 0;
}
백준 : 두 박스 : 15973 (0) | 2020.03.31 |
---|---|
[백준] 신기한 수 : 17618번 - 2019 정보올림피아드 2차 중등 1번문제 (0) | 2020.03.22 |
부분수열의 합 - 1182 (0) | 2020.03.01 |
랜선 자르기 1654번 (0) | 2020.03.01 |
10816번 숫자 카드 2 (0) | 2020.02.16 |
https://www.acmicpc.net/problem/1654
1654번: 랜선 자르기
첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그 후 K줄에 걸쳐 이미 가지고 있는 각 랜선의 길이가 센티미터 단위의 정수로 입력된다. 랜선의 길이는 231-1보다 작거나 같은 자연수이다.
www.acmicpc.net
#include<stdio.h>
long long k;
long long Lan[20000]; //원소는 초기화 됨.
long long div(long long len) //len로 자르기.
{
long long sum = 0;
for(int i=0; i<k; i++)
{
sum += (Lan[i]/len);
}
return sum;
}
int main(void)
{
long long n;
long long max = 0;
scanf("%lld %lld", &k, &n);
for(int i=0; i<k; i++)
{
scanf("%lld", &Lan[i]);
if(max<Lan[i])
{
max = Lan[i]; //최대 원소값 찾기
}
}
long long s = 1;
long long e = max; //mid의 범위를 1~최대 원소값까지로 고정.
long long mid;
long long res;
long long res2 = -1;
while(s<=e)
{
mid = (s+e)/2;
res = div(mid); //res는 조각의 개수.
//
if(res >= n)
{
if(res2 < mid) {
res2 = mid;
}
s=mid+1;
}
else
{
e=mid-1;
}
}
printf("%lld\n", res2);
return 0;
}
백준 : 개구리 점프: 17619번 - 2019 정보올림피아드 2차 중등 2번문제 (0) | 2020.03.17 |
---|---|
부분수열의 합 - 1182 (0) | 2020.03.01 |
10816번 숫자 카드 2 (0) | 2020.02.16 |
백준 - 숫자카드 : 10815번 (0) | 2020.02.10 |
백준 : 1로 만들기 1463번 (0) | 2020.02.09 |
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long int n,a[1000001]={0,},i;
scanf("%lld",&n);
for(i=2;i<=n;i++)
{
a[i]=a[i-1]+1;
if(i%2==0 && a[i] > a[i/2] + 1)
a[i] = a[i/2] + 1;
if(i%3==0 && a[i] > a[i/3] + 1)
a[i] = a[i/3] + 1;
}
/*
for(i=1; i<=n; i++)
printf("%lld : %lld \n",i, a[i]);
*/
printf("%d", a[n]);
return 0;
}
10816번 숫자 카드 2 (0) | 2020.02.16 |
---|---|
백준 - 숫자카드 : 10815번 (0) | 2020.02.10 |
백준 - 차이를 최대로 : 10819번 (0) | 2020.02.09 |
백준-가장 긴 증가하는 부분 수열 4 : 14002번 (LIS) (0) | 2020.02.08 |
백준-가장 긴 증가하는 부분 수열 : 11053번 ( LIS) (0) | 2020.02.08 |
https://www.acmicpc.net/problem/10819
10819번: 차이를 최대로
첫째 줄에 N (3 ≤ N ≤ 8)이 주어진다. 둘째 줄에는 배열 A에 들어있는 정수가 주어진다. 배열에 들어있는 정수는 -100보다 크거나 같고, 100보다 작거나 같다.
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a[1000000]={0,},max1=0,i,tmp=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
do
{
for(i=1;i<=n-1;i++)
{
tmp+=abs(a[i]-a[i+1]);
if(max1<tmp)
{
max1=tmp;
}
}
tmp=0;
}while(next_permutation(a+1,a+n+1));
printf("%d",max1);
return 0;
}
백준 - 숫자카드 : 10815번 (0) | 2020.02.10 |
---|---|
백준 : 1로 만들기 1463번 (0) | 2020.02.09 |
백준-가장 긴 증가하는 부분 수열 4 : 14002번 (LIS) (0) | 2020.02.08 |
백준-가장 긴 증가하는 부분 수열 : 11053번 ( LIS) (0) | 2020.02.08 |
백준-부등호 : 2529번 (0) | 2020.01.15 |
https://www.acmicpc.net/problem/14002
14002번: 가장 긴 증가하는 부분 수열 4
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
www.acmicpc.net
아래 코드를 먼저 참고바랍니다.
https://coding-gongboo.tistory.com/38?category=829643
백준-가장 긴 증가하는 부분 수열 : 11053번 ( LIS)
https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50..
coding-gongboo.tistory.com
11053번 문제는 수열의 길이만 구하면 되지만, 14002문제는 수열을 표현해 주어야 한다.
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n,i,a[1000]={0,},l[1000]={0,},j,ma=-1,k[1000]={0,},m;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
l[i]=1;
k[i]=i;
for(j=1;j<i;j++)
{
if(a[j]<a[i])
{
//l[i]=l[i]>l[j]+1 ? l[i] : l[j]+1;
if(l[i] < l[j]+1)
{
l[i] = l[j]+1;
k[i]=j;
}
}
}
// ma=ma>l[i]?ma:l[i];
if(ma<l[i]){
ma=l[i];
m=i;
}
}
printf("%d\n",ma);
l[1] = a[m];
for(i=2;i<=ma;i++)
{
l[i]=a[k[m]];
m = k[m];
}
for(i=ma;i>0;i--)
printf("%d ",l[i]);
return 0;
}
백준 : 1로 만들기 1463번 (0) | 2020.02.09 |
---|---|
백준 - 차이를 최대로 : 10819번 (0) | 2020.02.09 |
백준-가장 긴 증가하는 부분 수열 : 11053번 ( LIS) (0) | 2020.02.08 |
백준-부등호 : 2529번 (0) | 2020.01.15 |
백준 - 숨바꼭질 : 1697번 (0) | 2020.01.11 |
https://www.acmicpc.net/problem/11053
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
www.acmicpc.net
이문제는 LIS(Longest Increasing Subsequence) 라는 유명한 문제입니다.
아래 코드는 다이내믹 방식으로 소스코드를 작성했습니다.
참고하시구요. 질문이나 수정할 부분있으면 알려주세요.^^
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n,i,a[100000]={0,},l[100000]={0,},j,ma=-1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
l[i]=1;
for(j=1;j<i;j++)
{
if(a[j]<a[i])
l[i]=l[i]>l[j]+1 ? l[i] : l[j]+1;
}
ma=ma>l[i]?ma:l[i];
}
printf("%d",ma);
return 0;
}
백준 - 차이를 최대로 : 10819번 (0) | 2020.02.09 |
---|---|
백준-가장 긴 증가하는 부분 수열 4 : 14002번 (LIS) (0) | 2020.02.08 |
백준-부등호 : 2529번 (0) | 2020.01.15 |
백준 - 숨바꼭질 : 1697번 (0) | 2020.01.11 |
백준 - 2×n 타일링 2 : 11727번 (0) | 2020.01.11 |
https://www.acmicpc.net/problem/15652
15652번: N과 M (4)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
www.acmicpc.net
이번문제는 N과 M (2)와 유사하다. 단, 중복 가능하다.
아래 문제 조건과 같이 앞의 수가 다음수보다 작거나 같다은 조건을 만족하면 된다.
길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.
따라서 N과 M (2)에서 재귀함수의 첫번째 인자만, i+1이 아니랑 i를 주면 된다.
즉, i값을 포함해서 다음 수를 정해나가는 형태이다. 왜냐? 중복을 허용하기 때문이다.
#include <bits/stdc++.h>
using namespace std;
vector <int> nm;
void NM4(int, int, int);
int main() {
int n, m;
cin >> n >> m;
NM4(1, n, m);
return 0;
}
void NM4(int s, int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
for (int i = s; i <= n; i++) {
nm.push_back(i);
NM4(i, n, m); //현재 nm vector에 넣은 수 이후 수를 확인 한다. (오름차순)
nm.pop_back();
}
}
백준 - 타일링 : 1793번 (0) | 2019.12.23 |
---|---|
백준 - DFS와 BFS : 1260번 (0) | 2019.12.22 |
백준 - N과 M (3) : 15651번 (0) | 2019.12.19 |
백준 - A/B : 1008번 (0) | 2019.12.19 |
백준 - 개 : 10172번 (0) | 2019.12.19 |
https://www.acmicpc.net/problem/15651
15651번: N과 M (3)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
www.acmicpc.net
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. (중복가능)
N = 4, M = 2인 경우 아래와 같이 16(4*4) 개의 경우가 발생한다.
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
4 1
4 2
4 3
4 4
내 생각에는 N과 M(1)보다 풀이에 접근하기 더 쉬운 문제라고 생각한다. 내기준으로는 "N과 M(0)" 이 맞을듯.^^
#include <bits/stdc++.h>
using namespace std;
vector <int> res;
void NM3(int n, int m) {
if (res.size() == m) {
for (int i = 0; i < m; i++) {
cout << res[i] << " ";
}
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) {
res.push_back(i);
NM3(n, m);
res.pop_back();
}
}
int main() {
int n, m;
cin >> n >> m;
NM3(n, m);
return 0;
}
백준 - DFS와 BFS : 1260번 (0) | 2019.12.22 |
---|---|
백준 - N과 M (4) :15652 번 (0) | 2019.12.19 |
백준 - A/B : 1008번 (0) | 2019.12.19 |
백준 - 개 : 10172번 (0) | 2019.12.19 |
백준 - 단지번호붙이기 : 2667번 (0) | 2019.12.19 |
https://www.acmicpc.net/problem/11724
11724번: 연결 요소의 개수
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.
www.acmicpc.net
연결 요소의 개수의 경우, DFS나 BFS를 공부를 공부한 후라면 간단하게 해결 가능하다.
모든 정점을 대상으로 방문한 적이 없는 정점이 있으면 그 정점을 기준으로 DFS 또는 BFS순회를 통해 방문했다는 체크를 해둔다. 그 후에도 아직 방문하지 않은 정점이 있다면 또 DFS나 BFS를 통해 순회하면서 방문했다는 체크를 하면 된다.
#include <bits/stdc++.h>
using namespace std;
int n, l;
vector <int> a[1005];
int visited[1005] = { 0, };
void dfs_l(int s) {
int i;
visited[s]++;
for (i = 0; i < a[s].size(); i++){
if (visited[a[s][i]] == 0){
dfs_l(a[s][i]);
}
}
}
int main()
{
int i, n1, n2, cnt = 0;
scanf("%d %d", &n, &l);
//간선 정보를 입력 받아 그래프 만들기
for (i = 0; i < l; i++){
scanf("%d %d", &n1, &n2);
a[n1].push_back(n2);
a[n2].push_back(n1);
}
//DFS 순회시에 인접 정점중에 정점번호가 작은 값부터 순회하기 위해 정렬
//이번 문제에서는 굳이 없어도 됨.
for (int i = 0; i < n; i++) {
sort(a[i].begin(), a[i].end());
}
//방문하지 않은 정점을 발견하면 DFS순회함.
//DFS가 호출되는 횟수가 연결요소의 개수가 됨.
for (int i = 1; i <= n; i++){
if (visited[i] == 0){
dfs_l(i);
cnt++;
}
}
printf("%d", cnt);
return 0;
}
백준 - 개 : 10172번 (0) | 2019.12.19 |
---|---|
백준 - 단지번호붙이기 : 2667번 (0) | 2019.12.19 |
백준 - 윤년 : 2753번 (0) | 2019.12.18 |
백준 - 고양이 : 10171번 (0) | 2019.12.18 |
백준 - N과 M (2) : 15650번 (0) | 2019.12.18 |
https://www.acmicpc.net/problem/15650
15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
www.acmicpc.net
N과 M(1)문제 풀이 참고바람. (https://coding-gongboo.tistory.com/9?category=829643)
N과 M(1) 과의 차이점은 "고른 수열은 오름차순이어야 한다"는 점이다.
이를 위해서 현재 선택된 수 보다 1개 높은 위치의 수를 부터 수열을 만들어 나가야 한다.
이를 위해서 NM2(재귀함수)에 start해야 할 위치를 인자로 넘겨주는 부분이 수정되었다.
그리고 항상 다음 수를 대상으로 수열을 만들어 나가기 때문에 중복체크를 위한 included배열은 필요없다.
#include <bits/stdc++.h>
using namespace std;
//bool included[10]; //중복 체크
vector <int> nm;
void NM2(int, int, int);
int main() {
int n, m;
cin >> n >> m;
NM2(1, n, m);
return 0;
}
void NM2(int s, int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
for (int i = s; i <= n; i++) {
//if (!included[i]) {
//included[i] = true;
nm.push_back(i);
NM2(i + 1, n, m); //현재 nm vector에 넣은 수 이후 수를 확인 한다. (오름차순)
nm.pop_back();
//included[i] = false;
//}
}
}
두번째 풀이
각 수들을 포함 하거나 또는 포함 하지않으면서 다음수로 넘어가는 형태
#include <bits/stdc++.h>
using namespace std;
vector <int> nm;
void NM2(int level, int n, int m);
int main() {
int n, m;
cin >> n >> m;
NM2(1, n, m);
return 0;
}
void NM2(int level, int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
if (level > n) return;
nm.push_back(level);
NM2(level + 1, n, m);
nm.pop_back();
NM2(level + 1, n, m);
}
세번째 풀이
배열을 사용해서 결과값을 저장한 위치에 해당하는 index 인자를 관리해주고,
오름차순을 위해 다음 수를 지정해주는 start를 관리해 주는 형태
#include <bits/stdc++.h>
using namespace std;
int res[10];
void go(int index, int start, int n, int m);
int main() {
int n, m;
cin >> n >> m;
go(0, 1, n, m);
return 0;
}
void go(int index, int start, int n, int m) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << res[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i <= n; i++) {
res[index] = i;
go(index + 1, i + 1, n, m);
}
}
백준 - 연결 요소의 개수 : 11724번 (0) | 2019.12.18 |
---|---|
백준 - 윤년 : 2753번 (0) | 2019.12.18 |
백준 - 고양이 : 10171번 (0) | 2019.12.18 |
백준 - N과 M (1) : 15649번 (0) | 2019.12.17 |
백준 문제소 내용을 정리 (0) | 2019.12.17 |
알고리즘을 공부하다보면, bits/stdc++.h 라는 생소한 헤더파일을 사용하는것을 자주 볼것이다.
표준 header file이 아니다보니, visiual studio에는 포함되어 있지 않다.
bits/stdc++.h를 visual studio에서 사용하는 법은 간단하다.
visual studio의 include 폴더에 bits라는 폴더를 만들고 아래 소스코드를 포함하는 stdc++.h파일을 만들어주면 끝이다.
내 PC의 경우,
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\include\ 에
bits라는 폴더를 만들고, stdc++.h 넣어주면 끝~!!!
//stdc++.h 헤더파일 소스코드
#pragma once
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
STL Vector 사용법 (1) | 2022.10.04 |
---|
https://www.acmicpc.net/problem/15649
15649번: N과 M (1)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해야 한다.
www.acmicpc.net
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
N=4, M=4가 주어지면, 아래와 같이 12(4*3)개의 경우가 발생한다.
아래 1 4 와 4 1과 같이 순서가 다른 경우는 다른 것으로 판단해야 함.
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
"중복 없이"라는 조건이 있음으로 한번 수열에 포함된 수는 수열을 완성할때까지 다시 포함되면 안됨으로 포함 여부를 판단하기 위해 included라는 배열을 사용한다.
n = 4, m = 2를 입력하면, 아래와 같은 순서로 실행된다.
"1. go(4,2)" : nm에 1추가 (nm = 1)
"2. go(4,2)" : nm에 2추가 (nm = 1,2)
"3. go(4,2)" : nm.size()가 m임으로 nm의 내용 1,2 출력 후 return
"2. go(4,2)" 로 돌아감. nm에서 2를 pop_bakc하고, for문을 통해 i 증가시킨 후 nm에 3을 추가함.
#include <bits/stdc++.h>
using namespace std;
bool included[10]; //중복 체크
vector <int> nm;
void NM1(int, int);
int main() {
int n, m;
cin >> n >> m;
NM1(n, m);
return 0;
}
void NM1(int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) {
if (!included[i]) {
included[i] = true;
nm.push_back(i);
NM1(n, m);
nm.pop_back();
included[i] = false;
}
}
}
백준 - 연결 요소의 개수 : 11724번 (0) | 2019.12.18 |
---|---|
백준 - 윤년 : 2753번 (0) | 2019.12.18 |
백준 - 고양이 : 10171번 (0) | 2019.12.18 |
백준 - N과 M (2) : 15650번 (0) | 2019.12.18 |
백준 문제소 내용을 정리 (0) | 2019.12.17 |
지난 몇개월 동안 백준 문제풀이 사이트에서 딱 204개의 문제를 풀어봤다.
2020년도 안에 300문제정도를 더 풀어서 백준사이트 랭킹 1000등안에는 들어가볼 계획이다.
내가 직접푼 소스코드는 물론이고, 학생들과 공부하는 과정에서 얻은 주옥같은 코드들도 공유하려한다.
대한민국이 SW강국이 되는 그날을 기대하며.......
Baekjoon Online Judge
Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
www.acmicpc.net
백준 - 연결 요소의 개수 : 11724번 (0) | 2019.12.18 |
---|---|
백준 - 윤년 : 2753번 (0) | 2019.12.18 |
백준 - 고양이 : 10171번 (0) | 2019.12.18 |
백준 - N과 M (2) : 15650번 (0) | 2019.12.18 |
백준 - N과 M (1) : 15649번 (0) | 2019.12.17 |