https://www.acmicpc.net/problem/14501

 

14501번: 퇴사

첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.

www.acmicpc.net

 

 

 

#include "bits/stdc++.h"
using namespace std;
//퇴사
int n, maxi;
pair<int, int> arr[15];

void recursive(int start, int sum) {
    if (start >= n) {
        if (sum > maxi) maxi = sum;
        return;
    }
    for (int i=start; i<n; i++) {
        if (i+arr[i].first <= n) {
            recursive(i+arr[i].first, sum+arr[i].second);
        }
        else {
            recursive(i+arr[i].first, sum);
        }
    }
}

int main() {
    cin >> n;
    for (int i=0; i<n; i++) {
        cin >> arr[i].first >> arr[i].second;
    }
    recursive(0, 0);
    printf("%d", maxi);
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 암호만들기  (0) 2022.03.19
백준 - 부분수열의 합  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

JW

 

#include "bits/stdc++.h"
using namespace std;
//부분수열의 합
int arr[20], n, m, cnt;

void recursive(int start, int level, int sum) {
    if (start == level && sum == m) {
        cnt++;
    }
    for (int i=start; i<n; i++) {
        recursive(i+1, level, sum+arr[i]);
    }
}

int main() {
    cin >> n >> m;
    for (int i=0; i<n; i++) {
        cin >> arr[i];
    }
    for (int i=1; i<=n; i++) {
        recursive(0, i, 0);
    }
    printf("%d", cnt);
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 암호만들기  (0) 2022.03.19
백준 - 퇴사  (0) 2022.03.19
백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18

https://www.acmicpc.net/problem/6603

 

6603번: 로또

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로

www.acmicpc.net

 

JW

#include "bits/stdc++.h"
using namespace std;
//로또
int arr[13], result[6], n = 1;

void recursive(int start, int index) {
    if (index == 6) {
        for (int i=0; i<6; i++) {
            printf("%d ", result[i]);
        }
        printf("\n");
        return;
    }
    for (int i=start; i<n; i++) {
        result[index] = arr[i];
        recursive(i+1, index+1);
    }
}

int main() {
    while (n != 0) {
        cin >> n;
        for (int i=0; i<n; i++) {
            cin >> arr[i];
        }
        recursive(0, 0);
        printf("\n");
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 퇴사  (0) 2022.03.19
백준 - 부분수열의 합  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 1,2,3 더하기 (브루트 포스)  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14

 

https://www.acmicpc.net/problem/9095

 

9095번: 1, 2, 3 더하기

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

www.acmicpc.net

JW

 

 

#include "bits/stdc++.h"
using namespace std;
//1, 2, 3 더하기
int cnt, arr[10], n;

void recursive(int sum) {
    if (sum == n) {
        cnt++;
        return;
    }
    if (sum > n) return;
    for (int i=1; i<=3; i++) {
        recursive(sum+i);
    }
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        cnt = 0;
        cin >> n;
        for (int i=1; i<=3; i++) {
            recursive(i);
        }
        printf("%d\n", cnt);
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 로또  (0) 2022.03.19
백준 숫자카드 - 이분탐색  (0) 2022.03.18
백준 숨바꼭질 4 (역추적)  (0) 2022.03.14
백준 일곱 난쟁이  (0) 2022.03.14
백준 2×n 타일링 2  (0) 2022.03.14

https://www.acmicpc.net/problem/1934 

 

1934번: 최소공배수

두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있

www.acmicpc.net

 

 

#include <bits/stdc++.h>
using namespace std;
//최소공배수
int gcd(int a, int b) {
	while (b != 0) {
		int last = a % b;
		a = b;
		b = last;
	}
	return a;
}

int main() {
	int t, a, b;
	cin >> t;
	while (t--) {
		cin >> a >> b;
		int g = gcd(a, b);
		printf("%d\n", (a*b)/g);
	}
}

 

YT 구현

 

#include <bits/stdc++.h>
using namespace std;
//함수 3 형성평가6

int cal(int sum, int n){
    if(n==0){
        return sum;
    }

    if(n%10 != 0) sum *= n%10;

    return cal(sum, n/10);
}

int main(){
    int a,b,c;
    scanf("%d %d %d",&a, &b, &c);
    printf("%d", cal(1, a*b*c));
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

함수 3 형성평가4 rev2  (0) 2022.02.06
함수 3 형성평가4 rev.1  (0) 2022.02.06
함수 3 형성평가3  (0) 2022.02.06
함수 3 형성평가2  (0) 2022.02.06
최단 경로 - 다익스트라 - dijkstra  (0) 2022.02.01

 

HW 구현

 

#include <bits/stdc++.h>
using namespace std;
//함수 3 형성평가4 rev2
int d[100];
int cal(int n){
    if(n == 1 || n == 2){
        return n;
    }
    if(d[n] != 0) return d[n];
    d[n] = (cal(n-1) * cal(n-2))%100;
    return d[n];
}
int main(){
    int n;
    scanf("%d",&n);
    printf("%d", cal(n));
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

함수 3 형성평가6  (0) 2022.02.06
함수 3 형성평가4 rev.1  (0) 2022.02.06
함수 3 형성평가3  (0) 2022.02.06
함수 3 형성평가2  (0) 2022.02.06
최단 경로 - 다익스트라 - dijkstra  (0) 2022.02.01

JW 구현

 

#include <bits/stdc++.h>
using namespace std;
//함수 3 형성평가4

int cal(int n){
    if(n == 1 || n == 2){
        return n;
    }
    int a = (cal(n-1) * cal(n-2))%100;
    return a;
}
int main(){
    int n;
    scanf("%d",&n);
    printf("%d", cal(n));
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

함수 3 형성평가6  (0) 2022.02.06
함수 3 형성평가4 rev2  (0) 2022.02.06
함수 3 형성평가3  (0) 2022.02.06
함수 3 형성평가2  (0) 2022.02.06
최단 경로 - 다익스트라 - dijkstra  (0) 2022.02.01

JW 재귀함수

 

 

#include <bits/stdc++.h>
using namespace std;
//함수 3 형성평가3
int a, b;
int d[100];
int cal(int sum, int index){
    if(index > 3 || sum > b) return 0;
    
    if(index == 3 && sum == b){
        for(int i=0; i<a; i++){
            printf("%d ", d[i]);
        }
        printf("\n");
        return a;
    }


    for(int i=1; i<=6; i++){
        d[index] = i;
        cal(sum+i, index + 1);
    }
}
int main(){

    scanf("%d %d",&a, &b);
    cal(0, 0);
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

함수 3 형성평가4 rev2  (0) 2022.02.06
함수 3 형성평가4 rev.1  (0) 2022.02.06
함수 3 형성평가2  (0) 2022.02.06
최단 경로 - 다익스트라 - dijkstra  (0) 2022.02.01
문자열1 - 자가진단9  (0) 2022.01.19

이 ㅇ ㅎ 재귀함수

 

 

#include <bits/stdc++.h>
using namespace std;
//함수 3 형성평가2
int cal(int a){
    if(a==1 || a==2){
        printf("%d ", a);
        return a;
    }

    cal(a-2);
    printf("%d ", a);
    return 0;
}
int main(){
    int a;
    scanf("%d",&a);
    cal(a);
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

함수 3 형성평가4 rev.1  (0) 2022.02.06
함수 3 형성평가3  (0) 2022.02.06
최단 경로 - 다익스트라 - dijkstra  (0) 2022.02.01
문자열1 - 자가진단9  (0) 2022.01.19
함수3 - 자가진단3  (0) 2022.01.07
#include <bits/stdc++.h>
using namespace std;
//함수3 - 자가진단3

int f(int n){
    if(n==0)
        return n;

    return n + f(n-1);
}
int main() {
    int n;
    cin >> n;
    int a = f(n);
    printf("%d", a);
    return 0;
}

동빈나의 머지소트

 

#include <bits/stdc++.h>
using namespace std;

int number = 8;
int sorted[8]; //정렬 배열은 받드시 전역 배열

void merge(int a[], int m, int middle, int n){ //m : 시작점, middle : 중간점, n : 끝점

    int i = m;
    int j = middle+1;
    int k = m;

    //작은 순서대로 배열에 삽입
    while(i <= middle && j <= n){
        if(a[i] <= a[j]){
            sorted[k] = a[i];
            i++;
        }
        else{
            sorted[k] = a[j];
            j++;
        }
        k++;
    }
    if(i > middle){
        for(int t = j; t<=n; t++){
            sorted[k] = a[t];
            k++;
        }
    }
    else{
        for(int t=i; t<=middle; t++){
            sorted[k] = a[t];
            k++;
        }
    }

    //sorted 에서 a배열로 옮겨준다
    for(int t=m; t<=n; t++){
        a[t] = sorted[t];
    }
}

void mergesort(int a[], int m, int n){
    //크기가 1보다 큰 경우
    if(m < n){
        int middle = (m+n)/2;
        mergesort(a, m, middle);
        mergesort(a, middle+1, n);
        merge(a,m, middle, n);
    }
}

int main()
{
    int array[8] = {7,6,5,8,3,5,9,1};
    mergesort(array, 0, number-1);
    for(int t=0; t<number; t++){
        printf("%d ", array[t]);
    }
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

문자열1 - 자가진단9  (0) 2022.01.19
함수3 - 자가진단3  (0) 2022.01.07
머지 정렬 Merge Sort  (0) 2021.12.31
quick sort (퀵정렬) - 내림차순  (0) 2021.12.31
함수3 - 형성평가6  (0) 2021.12.30

동빈나의 머지소트

 

#include <bits/stdc++.h>
using namespace std;

int number = 8;
int sorted[8]; //정렬 배열은 받드시 전역 배열

void merge(int a[], int m, int middle, int n){ //m : 시작점, middle : 중간점, n : 끝점

    int i = m;
    int j = middle+1;
    int k = m;

    //작은 순서대로 배열에 삽입
    while(i <= middle && j <= n){
        if(a[i] <= a[j]){
            sorted[k] = a[i];
            i++;
        }
        else{
            sorted[k] = a[j];
            j++;
        }
        k++;
    }
    if(i > middle){
        for(int t = j; t<=n; t++){
            sorted[k] = a[t];
            k++;
        }
    }
    else{
        for(int t=i; t<=middle; t++){
            sorted[k] = a[t];
            k++;
        }
    }

    //sorted 에서 a배열로 옮겨준다
    for(int t=m; t<=n; t++){
        a[t] = sorted[t];
    }
}

void mergesort(int a[], int m, int n){
    //크기가 1보다 큰 경우
    if(m < n){
        int middle = (m+n)/2;
        mergesort(a, m, middle);
        mergesort(a, middle+1, n);
        merge(a,m, middle, n);
    }
}

int main()
{
    int array[8] = {7,6,5,8,3,5,9,1};
    mergesort(array, 0, number-1);
    for(int t=0; t<number; t++){
        printf("%d ", array[t]);
    }
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

함수3 - 자가진단3  (0) 2022.01.07
머지 정렬 Merge Sort  (0) 2021.12.31
quick sort (퀵정렬) - 내림차순  (0) 2021.12.31
함수3 - 형성평가6  (0) 2021.12.30
591 : 함수3 - 자가진단6  (0) 2021.12.30
#include <bits/stdc++.h>
using namespace std;
//퀵정렬 : 내림차순

void quick(int data[], int left, int right){

    int num, i, j, temp;
    if(right > left){
        num = data[right];
        i = left - 1;
        j = right;

        for(;;){
            while(data[++i] > num);
            while(data[--j] < num);
            if(i >= j)
                break;

            swap(data[i], data[j]);
        }
        swap(data[i], data[right]);

        quick(data, left, i-1);
        quick(data, i+1, right);
    }
}
int main() {

    int a[10] = {2,3,4,0,9,8,7,6,5,1};
    for(auto x : a){
        printf("%d ", x);
    }
    puts("\n");
    quick(a, 0, 9);
    for(auto x : a){
        printf("%d ", x);
    }
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

머지 정렬 Merge Sort  (0) 2021.12.31
머지 정렬 Merge Sort  (0) 2021.12.31
함수3 - 형성평가6  (0) 2021.12.30
591 : 함수3 - 자가진단6  (0) 2021.12.30
590 : 함수3 - 자가진단5  (0) 2021.12.30

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=226&sca=10d0 

 

JUNGOL

 

www.jungol.co.kr

 

#include <bits/stdc++.h>
using namespace std;
//함수3 - 자가진단3

int rec(int sum, int n){

    if(n==0)
        return sum;
    sum += n;
    rec(sum, n-1);
}
int main() {
    int n;
    cin >> n;

    printf("%d",rec(0, n));
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

590 : 함수3 - 자가진단5  (0) 2021.12.30
592 : 함수3 - 자가진단4  (0) 2021.12.30
미로탈출 - 파이썬  (0) 2021.02.04
음료수 얼려먹기 - 파이썬  (0) 2021.02.04
BFS - 파이썬  (0) 2021.02.04

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=225&sca=10d0 

 

JUNGOL

 

www.jungol.co.kr

 

#include <bits/stdc++.h>
using namespace std;
//함수3 - 자가진단2

void rec(int n){

    if(n==0)
        return;
    printf("%d\n", n);
    rec(n-1);
}
int main() {
    int n;
    cin >> n;
    rec(n);
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
//함수3 - 자가진단1

void rec(int n){

    if(n==0)
        return;
    printf("recursive\n");
    rec(n-1);
}
int main() {
    int n=3;
    rec(3);
    return 0;
}

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=133&sca=10d0

 

JUNGOL | 함수3 - 형성평가3 > 문제은행

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

www.jungol.co.kr

 

 

#include<bits/stdc++.h>
using namespace std;
//함수3 - 형성평가3
vector <int> v;

int check_sum(int n, int m){
    //v의 총합 이 M인지 확인
    int x=0;
    for(int i=0; i<n; i++){
        x=x+v[i];
    }
    if(x==m)return 1;
    else return 0;
}

void f(int n, int m)
{
    int i;
    //printf("=== %d \n", v.size());
    if(v.size()==n){
        if(check_sum(n,m)==1){
            //printf("===0");
            for(i=0; i<n; i++){
                printf("%d ",v[i]);
            }
            printf("\n");
            return;
        }
        else return;
    }

    for(i=1; i<=6; i++){
        v.push_back(i);
        f(n,m);
        v.pop_back();
    }
}


int main()
{
    int n,m;
    //printf("==== 0");
    scanf("%d %d",&n,&m);
    //printf("==== 1")
    f(n,m);
	return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

584 : 함수2 - 자가진단6  (0) 2020.03.01
586 : 함수2 - 자가진단8  (0) 2020.03.01
234 : 함수3 - 형성평가4  (0) 2020.03.01
589 : 함수3 - 자가진단3  (0) 2020.02.16
590 : 함수3 - 자가진단4  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=134&sca=10d0

 

JUNGOL | 함수3 - 형성평가4 > 문제은행

첫 번째는 1, 두 번째는 2, 세 번째부터는 앞의 두 수의 곱을 100으로 나눈 나머지로 이루어진 수열이 있다. 100 이하의 자연수 N을 입력받아 재귀함수를 이용하여 N번째 값을 출력하는 프로그램을 작성하시오.

www.jungol.co.kr

 

#include<bits/stdc++.h>
using namespace std;
/*함수3 - 형성평가4
첫 번째는 1, 두 번째는 2, 세 번째부터는 앞의 두 수의 곱을 100으로 나눈 나머지로 이루어진 수열이 있다.
100 이하의 자연수 N을 입력받아 재귀함수를 이용하여 N번째 값을 출력하는 프로그램을 작성하시오.
입력 예
8
출력 예
92
*/
int d[1004];
int f(int n)
{
    int result;
    if(n==1) return 1;
    if(n==2) return 2;
    if(d[n]>0){
        return d[n];
    }
    else{
        d[n] = (f(n-1)*f(n-2))%100;
        return d[n];
    }
}

int main()
{
    int n,k;
    scanf("%d",&n);
    k=f(n);
    printf("%d",k);
	return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

586 : 함수2 - 자가진단8  (0) 2020.03.01
233 : 함수3 - 형성평가3  (0) 2020.03.01
589 : 함수3 - 자가진단3  (0) 2020.02.16
590 : 함수3 - 자가진단4  (0) 2020.02.16
591 : 함수3 - 자가진단5  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=226&sca=10d0

 

JUNGOL | 함수3 - 자가진단3 > 문제은행

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

www.jungol.co.kr

 

#include<stdio.h>
int k=0,c=1;
int f(int p)
{
	k=k+c;
	if(c==p)return k;
	c++;
	f(p);
}
int main()
{
	int n,x;
	scanf("%d",&n);
	x=f(n);
	printf("%d ",x);
	return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

233 : 함수3 - 형성평가3  (0) 2020.03.01
234 : 함수3 - 형성평가4  (0) 2020.03.01
590 : 함수3 - 자가진단4  (0) 2020.02.16
591 : 함수3 - 자가진단5  (0) 2020.02.16
598 : 문자열1 - 자가진단6  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=227&sca=10d0

 

JUNGOL | 함수3 - 자가진단4 > 문제은행

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

www.jungol.co.kr

 

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
void f(int n, int c)
{
	int i;
	if(v.size()==n){
		for(i=0; i<n; i++){
			printf("%d ",v[i]);
		}
		printf("\n");
		return;
	}
	for(i=c; i<=6; i++){
		v.push_back(i);
		f(n,i);
		v.pop_back();
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	f(n,1);
	return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

234 : 함수3 - 형성평가4  (0) 2020.03.01
589 : 함수3 - 자가진단3  (0) 2020.02.16
591 : 함수3 - 자가진단5  (0) 2020.02.16
598 : 문자열1 - 자가진단6  (0) 2020.02.16
231 : 함수3 - 형성평가1  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=228&sca=10d0

 

JUNGOL | 함수3 - 자가진단5 > 문제은행

첫 번째 수는 1이고 N번째 수는 (N/2)번째 수(파이썬인경우 N//2번째)와 (N-1)번째 수의 합으로 구성된 수열이 있다. 50 이하의 자연수 N을 입력받아 재귀호출을 이용하여 이 수열에서 N번째 수를 출력하는 프로그램을 작성하시오. (1 2 3 5 7 10 13 18 …)

www.jungol.co.kr

#include<bits/stdc++.h>
int f(int p)
{
	if(p==1)return 1;
	return f(p/2)+f(p-1);
}
int main()
{
	int i,k,n;
	scanf("%d",&n);
	k=f(n);
	printf("%d\n",k);
	return 0;
}

위 코드는 입력 값 n이 커지면, 상당히 느려진다.

그래서 아래와 같이 메모이제이션을 적용하였다.

 

#include<bits/stdc++.h>
int c[1004]={0,};
int f(int p)
{
	if(p==1){
		return 1;
	}
	else if(c[p]!=0){
		return c[p];
	}
	else{
		c[p]=f(p/2)+f(p-1);
	    return c[p];
	}
}
int main()
{
	int i,k,n;
	scanf("%d",&n);
	k=f(n);
	printf("%d\n",k);
	return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

589 : 함수3 - 자가진단3  (0) 2020.02.16
590 : 함수3 - 자가진단4  (0) 2020.02.16
598 : 문자열1 - 자가진단6  (0) 2020.02.16
231 : 함수3 - 형성평가1  (0) 2020.02.16
232 : 함수3 - 형성평가2  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=131&sca=10d0

 

JUNGOL | 함수3 - 형성평가1 > 문제은행

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

www.jungol.co.kr

 

#include <bits/stdc++.h>
using namespace std;
/*
함수3 - 형성평가1
자연수 N을 입력받아 1부터 N까지 출력을 하되 n-1번째 값은 n번째 값을 2로 나눈 몫이 되도록 하는 프로그램을 작성하시오.
*/
void f(int n){
    if(n == 0) return;
    f(n/2);
    printf("%d ", n);
}

int main()
{
    int n;
    scanf("%d", &n);
    f(n);
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

591 : 함수3 - 자가진단5  (0) 2020.02.16
598 : 문자열1 - 자가진단6  (0) 2020.02.16
232 : 함수3 - 형성평가2  (0) 2020.02.16
579 : 함수2 - 자가진단1  (0) 2020.02.16
174 : 함수1 - 형성평가5  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=132&sca=10d0

 

JUNGOL | 함수3 - 형성평가2 > 문제은행

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

www.jungol.co.kr

 

 

#include <bits/stdc++.h>
using namespace std;
/*
함수3 - 형성평가2
자연수 N을 입력받아 N이 홀수인 경우에는 1부터 N까지의 홀수를  짝수인 경우는 2부터 N까지의 짝수를 모두 출력하는 프로그램을 재귀함수로 작성하시오.
*/
void f(int n){
    if(n == 1 || n == 2){
        printf("%d ", n);
        return;
    }
    f(n-2);
    printf("%d ", n);
}

int main()
{
    int n;
    scanf("%d", &n);
    f(n);
    return 0;
}


'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

598 : 문자열1 - 자가진단6  (0) 2020.02.16
231 : 함수3 - 형성평가1  (0) 2020.02.16
579 : 함수2 - 자가진단1  (0) 2020.02.16
174 : 함수1 - 형성평가5  (0) 2020.02.16
173 : 함수1 - 형성평가4  (0) 2020.02.16

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=224&sca=10d0

 

JUNGOL | 함수3 - 자가진단1 > 문제은행

경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호 TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com Copyrightⓒ 2010-2019 jungol. All right reserved. TOP

www.jungol.co.kr

#include <bits/stdc++.h>
using namespace std;
/*
함수3 - 자가진단1
20 이하의 자연수 N을 입력받아 재귀함수를 이용해서 문자열 “recursive”를 N번 출력하는 프로그램을 작성하시오.
입력 예
3
출력 예
recursive
recursive
recursive
*/

void re(int p,int n)
{
    printf("recursive\n");
    if(p==n)return;
    p++;
    re(p,n);
}

int main()
{
    int n;
    scanf("%d",&n);
    re(1,n);
    return 0;
}

 

아래와 같이 수정했을때 , 출력 결과가 어떻게 나올지 생각해보면, 재귀함수 이해에 도움이 많이 될것 같네요.^^

 

#include <bits/stdc++.h>
using namespace std;
/*
함수3 - 자가진단1
20 이하의 자연수 N을 입력받아 재귀함수를 이용해서 문자열 “recursive”를 N번 출력하는 프로그램을 작성하시오.
입력 예
3
출력 예
recursive
recursive
recursive
*/

void re(int p,int n)
{
    printf("recursive %d   %d  \n", p, n);
    if(p==n)return;
    p++;
    re(p,n);
    printf("xxx %d   %d\n", p, n);
}

int main()
{
    int n;
    scanf("%d",&n);
    re(1,n);
    return 0;
}

'정보올림피아드-KOI > 기초 문법 문제' 카테고리의 다른 글

172 : 함수1 - 형성평가3  (0) 2020.02.16
함수3 - 자가진단2  (0) 2020.02.09
함수2 - 형성평가7  (0) 2020.02.09
함수2 - 형성평가6  (0) 2020.02.09
함수2 - 형성평가5  (0) 2020.02.09

https://www.acmicpc.net/problem/3344

 

3344번: N-Queen

문제 8*8 체스보드에 8개의 퀸을 서로 공격하지 못하게 놓는 문제는 잘 알려져 있는 문제이다. 퀸은 같은 행, 열, 또는 대각선 위에 있는 말을 공격할 수 있다. 이 문제의 한가지 정답은 아래 그림과 같다. 이 문제의 조금 더 일반화된 문제는 Franz Nauck이 1850년에 제기했다. N*N 보드에 N개의 퀸을 서로 다른 두 퀸이 공격하지 못하게 놓는 경우의 수는 몇 가지가 있을까? 이 문제는 N>3인 경우에 경우의 수가 적어도 1개 라는 것이 증명

www.acmicpc.net

N-Queen문제 생각보다 어렵죠? 아마도 N-Queen문제에서 막혀서 찾아오셨다면, 아마도 백트랙킹 / 재귀함수에 대해서 아주 조금 이해가 힘드셔서 오셨을것 같네요.^^ 아래 코드보시면서 도움 되시기 바랍니다.

 

각 행을 한개씩 내려가면서 Queen을 놓을 곳을 찾아가면 될것 같다.

첫번째 행의 어느 열에 Queen을 위치시키면, 그 열과 대각선 방향을 더이상 Queen을 놓을수 없음을 표시해야 한다.

 

bool check_right_up[100]; //이미 대각선 오른쪽 위로 queen이 있는지 확인
위 코드는 아래 그림을 보고 이해할 수 있길 바랍니다. 대각선의 각 cell의 행값 + 열값은 unique하다는 걸 이용해서,

그 unique한 값을 배열의 index로 사용해서, 그 대각선에 이미 Queen이 위치해 있음을 판단하면 됩니다.

 

bool check_right_down[100]; //이미 대각선 오른쪽 아래로 queen이 있는지 확인

아래 그림은 행-열을 한 값을 표시하고 있다. 음수가 발생하니, 모든 값들에 N을 더하면,

1,2,3,4,5,6,7 로 unique한 값을 만들수 있고, 이것을 배열의 index로 이용하면 됩니다.

 

#include <bits/stdc++.h>
using namespace std;
bool a[15][15];
int n;
bool check_col[15]; //이미 그 열에 queen이 있는지 확인
bool check_right_up[100]; //이미 대각선 오른쪽 위로 queen이 있는지 확인
bool check_right_down[100]; //이미 대각선 오른쪽 아래로 queen이 있는지 확인

void check_onoff(int row, int col, bool onoff)
{
    check_right_up[row + col] = onoff;
    check_right_down[row - col + n] = onoff;
    check_col[col] = onoff;
    a[row][col] = onoff;
}
bool check(int row, int col) {
    // 같은 열 확인
    if (check_col[col]) {
        return false;
    }
    // 오른쪽 위방향 대각선 확인 (왼쪽 아래도^^)
    if (check_right_up[row + col]) {
        return false;
    }
    // 오른쪽 아래 방향 대각선 확인 (왼쪽 위도^^)
    if (check_right_down[row - col + n]) {
        return false;
    }
    return true;
}

int N_Queen(int row) {
    if (row == n) {
        return 1;
    }
    int cnt = 0;
    for (int col = 0; col < n; col++) {
        if (check(row, col)) { //이 row, col위치에 놓을수 있을지 확인
            check_onoff(row, col, true);  //놓을 수 있으니까, 그 위치 관련해서 놓았다는 표시를 함
            cnt += N_Queen(row + 1);  //다음 행에 queen을 놓으로 감.
            check_onoff(row, col, false); //row, col 기준으로 확인해보 후 임으로, 다시 해제함.
        }
    }
    return cnt;
}
int main() {
    cin >> n;
    cout << N_Queen(0) << '\n';
    return 0;
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 최소,최대 : 10818번  (0) 2020.01.02
백준 - 동전 0 : 11047번  (0) 2020.01.02
백준 - 타일링 : 1793번  (0) 2019.12.23
백준 - DFS와 BFS : 1260번  (0) 2019.12.22
백준 - N과 M (4) :15652 번  (0) 2019.12.19

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();
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 타일링 : 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;
}

 

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 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/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);
    }
}

'정보올림피아드-KOI > BOJ' 카테고리의 다른 글

백준 - 연결 요소의 개수 : 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

+ Recent posts