#include <iostream>
using namespace std;

int main()
{
    int arr[8] = { 83, 72, 65, 54, 47, 33, 29, 1 };

    int i = 1;
    int j, k;

    do {
        int front = arr[i];
        j = i - 1;

        do {
            int back = arr[j];
            k = j + 1;

            if (front < back)
            {
                int tmp = arr[k];
                arr[k] = arr[j];
                arr[j] = tmp;
            }
            else if (front >= back)
            {
                j = -1;
            }

            j--;

        } while (j >= 0);
        i++;
        for (int l = 0; l < 8; l++) { cout << arr[l] << ' '; }
        cout << endl;
    } while (i < 8);
}

 

'끄적끄적' 카테고리의 다른 글

C++ Link  (0) 2023.08.16
Insertion Sort (Lisp)  (0) 2022.05.01
Iterative Quicksort (C++)  (0) 2022.05.01

Lisp에서의  Insertion Sort

(setq lista(list 83 72 65 54 47 33 29 1))
(setq listb(list 11 33 23 45 13 25 8 135))


(defun insSort (list)
    (print list)		;정렬하려는 리스트 원본 보여줌
    (print '정렬시작----------------)
	(setq a (length list))		;a=length(list)

	(setq i 1)		;i=1... 

	(loop while (< i a)
	do(
		progn
			(setf front (nth i list))		;front= list의 i 번째 요소
			(setq j (- i 1))		;j= i-1

			(loop while (>= j 0)
				do(progn
					(setq k (+ j 1))
					(setq back (nth j list))		;back= list의 j 번째 요소
					(cond
						((>= front back)	
							(setq j -1)		;while문 탈출
						)	
							
						((< front back)
							(progn
								(setf tmp (nth k list))		;tmp= list[k]
								(setf (nth k list) (nth j list))	;list[k]= list[j]
								(setf (nth j list) tmp)		;list[j]= tmp
							)
						)
					)
					(setq j (- j 1))	;j--
					
				)
			)
			(setq i (+ i 1))		;i++
			(print list)	;한 단계 정렬 결과 출력
		)
	)
)

(insSort lista)
(print '=======================)
(insSort listb)

'끄적끄적' 카테고리의 다른 글

C++ Link  (0) 2023.08.16
Insertion Sort (C++)  (0) 2022.05.01
Iterative Quicksort (C++)  (0) 2022.05.01

Iterative Quicksort

#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;

int partition(int a[], int start, int end)
{
    int pivot = a[end]; //오른쪽 끝을 피벗으로

    int pIndex = start; //작은 수는 pindex 왼쪽, 큰 수는 오른쪽, 같은 건 어느쪽이든 상관없음

    // 원소가 피벗과 같거나 작으면 pindex 증가 후 피벗 앞에(왼쪽) 놓임
    for (int i = start; i < end; i++)
    {
        if (a[i] <= pivot)
        {
            swap(a[i], a[pIndex]); //왼쪽으로 보냄 (정확히는 a[0+i]으로
            pIndex++;
        }
    }

    swap(a[pIndex], a[end]); //pindex와 pivot을 스왑

    return pIndex;
}

// Iterative Quicksort routine
void iterativeQuicksort(int a[], int n)
{
    stack<pair<int, int>> s; //pair(int, int)가 들어가는 스택 s

    int start = 0;
    int end = n - 1;

    s.push(make_pair(start, end)); //(0, n-1)

    while (!s.empty()) //스택이 빌 때까지 루프
    {
        start = s.top().first, end = s.top().second;
        s.pop();

        // rearrange elements across pivot
        int pivot = partition(a, start, end);

        // push subarray indices containing elements that are
        // less than the current pivot to stack
        if (pivot - 1 > start) {
            s.push(make_pair(start, pivot - 1));
        }

        // push subarray indices containing elements that are
        // more than the current pivot to stack
        if (pivot + 1 < end) {
            s.push(make_pair(pivot + 1, end));
        }
    }
}

// Iterative Implementation of Quicksort
int main()
{
    int a[] = { 2, 5, 10, 8, 13, 6, 3 };
    int n = sizeof(a) / sizeof(a[0]);

    iterativeQuicksort(a, n);

    // print the sorted array
    for (int i = 0; i < n; i++) {
        cout << a[i] << " ";
    }

    return 0;
}

'끄적끄적' 카테고리의 다른 글

C++ Link  (0) 2023.08.16
Insertion Sort (C++)  (0) 2022.05.01
Insertion Sort (Lisp)  (0) 2022.05.01

백준 1018번: 체스판 다시 칠하기

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

#include <iostream>
using namespace std;

string WB[8] = { "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW" };
string BW[8] = { "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB", "BWBWBWBW", "WBWBWBWB" };
string board[50] = { ""  };

int Func_WB(int X, int Y)
{
	int countWB = 0;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (board[X + i][Y + j] != WB[i][j])
			{ 
				countWB++;
			}
		}
	}
	return countWB;
}

int Func_BW(int X, int Y)
{
	int countBW = 0;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 8; j++)
		{
			if (board[X + i][Y + j] != BW[i][j]) 
			{ 
				countBW++; 
			}
		}
	}
	return countBW;
}


int main()
{
	int M, N;
	int count = 32;
	cin >> N >> M;

	for (int i = 0; i < N; i++) 
	{ 
		cin >> board[i]; 
	}

	for (int i = 0; i <= N-8; i++)
	{
		for (int j = 0; j <= M-8; j++)
		{
			int black= Func_BW(i, j);
			int white= Func_WB(i, j);

			if (black < white && black < count) 
			{ 
				count = black; 
			}

			if (black > white && white < count) 
			{ 
				count = white; 
			}
		}
	}

	cout << count;
}

for문이 중복으로 네 개는 써지는 것 같아서

결국 함수로 뺐음

 

'백준' 카테고리의 다른 글

[백준] 4948번: 베르트랑 공준  (0) 2022.12.19
[백준] 1193번: 분수찾기 (C++)  (0) 2022.12.08
[백준] 7568번: 덩치 (C++)  (0) 2022.03.19
[백준] 10870번: 피보나치 수 5 (C++)  (0) 2022.02.22
[백준] 10872번: 팩토리얼 (C++)  (0) 2022.02.22

백준 7568번: 덩치

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

#include <iostream>
using namespace std;

int main()
{
	int N;
	cin >> N;
	int height[50] = { 0, };
	int weight[50] = { 0, };
	int score[50] = { 0, };

	for (int i = 0; i < N; i++)
	{
		cin >> height[i] >> weight[i];
	}

	for (int i = 0; i < N; i++) //i번째 사람에 대해
	{
		int cnt = 0;

		for (int j = 0; j < N; j++) //나머지 모든 사람에 대해
		{
			if (height[i] < height[j] && weight[i] < weight[j])
			{
				cnt++;
			}
		}
		score[i] = cnt;
	}

	for (int i = 0; i < N; i++)
	{
		cout << score[i] + 1 << ' ';
	}
}

처음에는 점수 배열도 만들고 순위 배열도 만들어서 이상하게 꼬아서 하는 바람에 예제 출력은 제대로 나왔지만 통과하지 못했는데,

문제를 다시 잘 읽어보니

"자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다."

라고 써 있어서 그냥 점수에 +1 한 결과를 출력해주었다.

백준 10870번: 피보나치 수 5

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

#include <iostream>
using namespace std;

int fib(int n)
{
	if (n == 0) { return 0; }
	else if (n == 1) { return 1; }
	else { return (fib(n-1) + fib(n-2)); }
}

int main()
{
	int N;
	cin >> N;
	cout << fib(N);
}

 

백준 10872번: 팩토리얼

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

 

처음에는 어라 이거 그냥 for문 때리면 되는 거 아닌가 하고

#include <iostream>
using namespace std;

int main()
{
	int N;
	int n = 1;
	cin >> N;

	if (N != 0)
	{
		for (int i = 1; i <= N; i++) { n *= i; }
	}

	cout << n;
}

이렇게 풀었었는데

가만히 생각해보니 이 문제는 재귀함수 카테고리에 들어 있어서 이렇게 풀면 안 될 것 같았다

#include <iostream>
using namespace std;

int fac(int n)
{
	if (n == 0) { return 1; }
	return n * fac(n - 1);
}

int main()
{
	int N;
	cin >> N;
	cout << fac(N);
}

재귀함수 사용해서 다시 클리어

 

백준 2675번: 문자열 반복

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

 

#include <iostream>
using namespace std;

int main()
{
	int T;
	cin >> T;

	for (int i = 0; i < T; i++)
	{
		int R;
		string S;
		cin >> R >> S;

		for (int j = 0; j < S.length(); j++)
		{
			for (int k = 0; k < R; k++)
			{
				cout << S[j];
			}
		}
		cout << endl;
	}
}

 

생각했던 대로 풀린 문제

'백준' 카테고리의 다른 글

[백준] 7568번: 덩치 (C++)  (0) 2022.03.19
[백준] 10870번: 피보나치 수 5 (C++)  (0) 2022.02.22
[백준] 10872번: 팩토리얼 (C++)  (0) 2022.02.22
[백준] 10809번: 알파벳 찾기 (C++)  (0) 2022.01.10
[백준] 10951번: A+B - 4 (C++)  (0) 2021.12.30

+ Recent posts