Flood Fill

- 피자배달(어려움)

#include<iostream>//   피자배달

#include<vector>

#include<cstring>
using namespace std;
int map[4][6] = {
0,0,0,2,1,0,
9,9,0,0,9,0,
3,9,9,0,0,0,
4,0,2,0,3,4,
};
struct node {
    int y; int x; int level;
};
int bfs(int starty, int startx, int targetN, intky, intkx)
{
    node queue[1000] = { starty,startx,0 };
    int head = 0;
    int tail = 1;
    int used[4][6] = { 0 };
    used[starty][startx] = 1;
    int direct[4][2] = { 0,1,0,-1,1,0,-1,0 };
    while (head != tail)
    {
        node now = queue[head++];
        for (int t = 0; t < 4; t++)
        {
            int dy = direct[t][0] + now.y;
            int dx = direct[t][1] + now.x;
            if (dy < 0 || dx < 0 || dy>3 || dx>5)continue;
            if (map[dy][dx] == 9)continue;
            if (used[dy][dx] == 1)continue;
            used[dy][dx] = 1;
            queue[tail++] = { dy,dx,now.level + 1 };
            if (map[dy][dx] == targetN) {
                *ky = dy;
                *kx = dx;
                return now.level + 1;
            }

    }
}
}

int main()
{
    int starty = 0;
    int startx = 0;
    int ky, kx;
    int targetN = 1;
    int cnt = 0;

while (1)
{
    int ret = bfs(starty, startx, targetN, &ky, &kx);
    if (ret == -1)break;
    cnt += ret;
    starty = ky;
    startx = kx;
    targetN++;
    if (targetN == 5)break;
}

cout << cnt;

return 0;
}

- 벽 두개 부수고 최소거리로 연결하기

 1. 벽 정리(sett) 후 이중for문 통해 두개 선택

 2. 선택한 벽 0 초기화 후 경로 확인

 3. 돌아올때 백업된 벽 복구해주기 memcpy

#include<iostream>// 벽 두개!

#include<vector>

#include<cstring>
using namespace std;
int map[4][6] = {
    0,0,1,1,1,1,
    0,0,1,0,0,1,
    0,0,1,0,0,1,
    0,1,1,1,1,0,
};
int backup[4][6];
struct node { int y; int x; int level; };
int direct[4][2] = { 1,0,-1,0,0,-1,0,1 };
vector<node>wall;
int Min = 21e8;
void sett()
{
    for (int y = 0; y < 4; y++)
    {
        for (int x = 0; x < 5; x++)
        {
            if (map[y][x] == 1)
            {
                wall.push_back({ y,x,0 });
            }
        }
    }
}
int bfs()
{
    node queue[1000] = { 0,0,0 };
    int head = 0;
    int tail = 1;
    int used[4][6] = { 0 };
    while (head != tail)
    {
        node now = queue[head++];
        for (int t = 0; t < 4; t++) {
            int dy = direct[t][0] + now.y;
            int dx = direct[t][1] + now.x;
            if (dy < 0 || dx < 0 || dy>3 || dx>5)continue;
            if (map[dy][dx] == 1)continue;
            if (used[dy][dx] == 1)continue;
            used[dy][dx] = 1;
            queue[tail++] = { dy,dx,now.level + 1 };
            if (dy == 3 && dx == 5) {
                return now.level + 1;
            }

    }
}
}
int main()
{

sett();
memcpy(backup, map, 4 * 4 * 6);
// 벽 선택
for (int a = 0; a < wall.size(); a++)
{
    for (int b = a + 1; b < wall.size(); b++)
    {
        //  원상복구 해주고 
        memcpy(map,backup, 4 * 4 * 6);
        map[wall[a].y][wall[a].x] = 0;
        map[wall[b].y][wall[b].x] = 0;

        int ret = bfs();
        if (ret < Min)Min = ret;
    }
}
cout << Min;

return 0;
}

- 최소거리로 두 다리 잇기

#include<iostream>
using namespace std;
int map[5][6] = {
    1,1,1,0,0,0,
    0,1,0,0,0,0,
    0,0,0,0,0,1,
    0,0,0,0,0,1,
    0,0,0,1,1,1,
};

struct node {
    int y, x;
    int level;
};
int used[5][6];
int head, tail;
int direct[4][2] = {
    0,1,0,-1,-1,0,1,0
};
node queue[1000];
void bfs1()
{
    head = 0;
    tail = 1;
    queue[0] = { 0,0,0 };
    used[0][0] = 1;

while (head != tail)
{
    node now = queue[head++];
    for (int t = 0; t < 4; t++)
    {
        int dy = direct[t][0]+now.y;
        int dx = direct[t][1]+now.x;
        if (dy < 0 || dx < 0 || dy>4 || dx>5)continue;
        if (map[dy][dx] == 0)continue;
        if (used[dy][dx] == 1)continue;
        used[dy][dx] = 1;
        queue[tail++] = { dy,dx,now.level};
    }
}
}
int bfs2()
{
    head = 0;
    while (head != tail)
    {
        node now = queue[head++];
        for (int t = 0; t < 4; t++)
        {
            int dy = direct[t][0] + now.y;
            int dx = direct[t][1] + now.x;
            if (dy < 0 || dx < 0 || dy>4 || dx>5)continue;
            if (used[dy][dx] == 1)continue;
            used[dy][dx] = 1;
            queue[tail++] = { dy,dx,now.level + 1 };

            if (map[dy][dx] == 1) { 
                return now.level + 1;
            }
            map[dy][dx] = map[now.y][now.x] + 1;
        }
    }
}
int main()
{

bfs1();  //  등록
int ret = bfs2(); //  다리2 찾기
cout << ret;

return 0;
}

- 여자친구데리고 식당가기 (미로찾기?)

#include<iostream> //    going out

#include<cstring> 
using namespace std;
int map[3][7] = {
    0,0,0,0,0,1,0,
    0,0,1,1,0,0,1,
    0,0,0,1,1,0,0,
};
int direct[4][2] = {
    0,1,0,-1,1,0,-1,0
};
struct node {
    int y, x;
    int level;
};
int cnt;
int bfs(int starty, int startx, int endy, int endx)
{
    node queue[100] = { starty,startx,0 };
    int head = 0, tail = 1;
    int used[3][7];
    used[starty][startx] = 1;

while (head != tail)
{
    node now = queue[head++];
    for (int t = 0; t < 4; t++)
    {
        int dy = direct[t][0] + now.y;
        int dx = direct[t][1] + now.x;
        if (dy < 0 || dx < 0 || dy>2 || dx>6)continue; // 맵 범위
        if (used[dy][dx] == 1)continue; // 중복방지
        if (map[dy][dx] == 1)continue; //  벽
        used[dy][dx] = 1;
        queue[tail++] = { dy,dx,now.level + 1 };
        if (dy == endy && dx == endx)
        {
            return now.level + 1;
        }
    }
}
}
int main()
{

cnt += bfs(0,0,2,6);
cnt += bfs(2,6,2,0);
cout << cnt;

return 0;
}

- 섬의 갯수 구하기

#include<iostream> //  섬의 갯수 구하기
using namespace std;
int map[5][5] = {
    1,0,0,1,0,
    0,0,1,0,0,
    0,0,0,0,0,
    0,1,1,1,0,
    1,0,1,0,0,
};
int direct[4][2] = {
    0,1,0,-1,1,0,-1,0
};
struct node {
    int y, x;
};
int cnt;
void bfs(int yy, int xx)
{
    node queue[1000] = { yy,xx };
    int head = 0;
    int tail = 1;

while (head != tail)
{
    node now = queue[head++];
    for (int t = 0; t < 4; t++)
    {
        int dy = direct[t][0] + now.y;
        int dx = direct[t][1] + now.x;
        if (dy < 0 || dx < 0 || dy>4 || dx>4)continue;
        if (map[dy][dx] == 0)continue;
        map[dy][dx] = 0;
        queue[tail++] = { dy,dx };
    }
}
}
int main()
{

    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            if (map[i][j] == 1) {
                cnt++;
                bfs(i, j);
            }

    }
}
cout << cnt;
return 0;
}

- 섬의 크기 구하기 (응용 - 여러개의 섬, 가장 큰 크기의 섬 찾기)

//섬의 시작지점부터 0으로 바꾸면서 확인
#include<iostream>

using namespace std;

int map[5][5] = {
	0,0,1,0,0,
	0,1,1,0,0,
	1,1,1,1,0,
	0,0,1,0,0,
	0,0,1,0,0,
};

struct node {
	int y;
	int x;
	int level;
}queue[100];

int head;
int tail=1;

int direct[4][2] = {
	0,1,
	0,-1,
	1,0,
	-1,0
};

int main() {
	int flag = 1;
	for (int y = 0; y < 5; y++) {
		for (int x = 0; x < 5; x++) {
			if (map[y][x] == 1) {
				queue[0] = { y,x,1 };
				flag = 1;
				break;
			}
		}if (flag == 1)break;
	}

	int cnt = 0;
	node now;
	while (head != tail) {
		now = queue[head++];
		for (int t = 0; t < 4; t++) {
			int dy = direct[t][0] + now.y;
			int dx = direct[t][1] + now.x;
			if (dy < 0 || dx < 0 || dy>4 || dx>4) continue;
			if (map[dy][dx] == 0)continue;
			map[dy][dx] = 0;
			cnt++;
			queue[tail++] = { dy,dx,now.level + 1 };
		}
	}

	cout << cnt;
	
}

- 산에서 불이났을때 돌을피해서 퍼져나갈경우 전체까지 몇일 걸리는가

#include<iostream>

using namespace std;

int map[5][5] = {
	0,0,0,0,0,
	0,1,0,1,0,
	0,-1,0,0,0,
	0,0,1,-1,0,
	0,0,0,0,0,
};

struct node {
	int y;
	int x;
	int level;
}queue[100];

int head;
int tail;

int direct[4][2] = {
	0,1,
	0,-1,
	1,0,
	-1,0
};

int main() {
	for (int y = 0; y < 5; y++) {
		for (int x = 0; x < 5; x++) {
			if (map[y][x] == 1)
				queue[tail++] = { y,x,1 };
		}
	}

	node now;
	while (head != tail) {
		now = queue[head++];
		for (int t = 0; t < 4; t++) {
			int dy = direct[t][0] + now.y;
			int dx = direct[t][1] + now.x;
			if (dy < 0 || dx < 0 || dy>4 || dx>4) continue;
			if (map[dy][dx] != 0)continue;
			map[dy][dx] = map[now.y][now.x] + 1;
			queue[tail++] = { dy,dx,now.level + 1 };
		}
	}

	cout << now.level;
	
}

- 입력받은 위치로부터 상하좌우방향으로 바이러스가 퍼져나갈때 전체가 다 걸리는데 몇일이 걸리는가

#include<iostream>

using namespace std;

int map[4][5];

struct node {
	int y;
	int x;
	int level;
}queue[100];

int head = 0;
int tail = 1;

int direct[4][2] = {
	0,1,
	0,-1,
	1,0,
	-1,0
};

int main() {
	node now;

	cin >> queue[0].y >> queue[0].x;

	queue[0].level = 0;
	map[queue[0].y][queue[0].x] = 1;
	while (head != tail) {
		now = queue[head++];
		for (int i = 0; i < 4; i++) {
			int dy = now.y + direct[i][0];
			int dx = now.x + direct[i][1];
			if (dy < 0 || dx < 0 || dy>3 || dx>4) continue;
			if (map[dy][dx] != 0) continue;
			map[dy][dx] = map[now.y][now.x] + 1;
			queue[tail++] = { dy,dx,now.level + 1 };
		}
	}
	
	cout << map[queue[tail - 1].y][queue[tail - 1].x];
		//cout << queue[tail - 1].level + 1;
}

- (2,2) 지역부터 꽃이 피기 시작하여 전체 배열에 다 필때까지 몇일이 걸리는가

#include<iostream>

using namespace std;

int map[4][4];

struct node {
	int y;
	int x;
	int level;
}queue[100] = { 2,2,0 };

int head = 0;
int tail = 1;

int direct[4][2] = {
	0,1,  //우
	0,-1, //좌
	1,0,  //아래
	-1,0, //위
};

int main() {
	map[2][2] = 1;
	while (head != tail) {
		node now = queue[head++];
		for (int t = 0; t < 4; t++) {
			int dy = now.y + direct[t][0];
			int dx = now.x + direct[t][1];
			if (dy < 0 || dx < 0 || dy>3 || dx>3) continue;
			if (map[dy][dx] != 0)continue;
			map[dy][dx] = map[now.y][now.x] + 1;
			queue[tail++] = { dy,dx,now.level + 1 };
		}
	}

	cout << queue[tail - 1].level + 1;
}

- 땅 팔때마다 땅값 *3 %10으로 바뀜, 3곳의 땅값의 합이 가장 큰경우 찾기

#include<iostream>
#include<cstring>
using namespace std;
int map[3][3] =
{
    4,1,7,
    8,9,1,
    1,5,2
};
int Max = -21e8;
void digging(int y,int x)
{
    int direct[5][2] = { 0,0,-1,0,1,0,0,-1,0,1 };
    for (int t = 0; t < 5; t++)
    {
        int dy = y + direct[t][0];
        int dx = x + direct[t][1];
        if (dy < 0 || dx < 0 || dy>2 || dx>2)continue;
        int n = map[dy][dx] * 3;
        map[dy][dx] = n % 10;
    }
}
int getsum()
{
    int sum = 0;
    for (int y = 0; y < 3; y++) {
        for (int x = 0; x < 3; x++)
        {
            sum += map[y][x];
        }
    }
    return sum;
}
void abc(int level)
{
    int backup[3][3];
    if (level == 3)
    {
        int result = getsum();
        if (result > Max)
        {
            Max = result;
        }
        return;
    }

    memcpy(backup, map, sizeof(map));
    for (int y = 0; y < 3; y++)
    {
        for (int x = 0; x < 3; x++)
        {
            digging(y, x);
            abc(level + 1);
            memcpy(map, backup, sizeof(backup));
        }
    }
}
int main()
{
    abc(0);
    cout << Max;
    return 0;
}

- ABTK -> AKTB 변환하는데 걸리는 최소횟수

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string start = "ABTK";
string target = "AKTB";

void lspin()
{
    char temp = start[0];
    start[0] = start[1];
    start[1] = start[2];
    start[2] = start[3];
    start[3] = temp;
}

void rspin()
{
    char temp = start[3];
    for (int t = 3; t > 0; t--)
    {
        start[t] = start[t - 1];
    }
    start[0] = temp;
}
void tover()
{
    char temp[4];
    for (int t = 0; t < 4; t++)temp[3 - t] = start[t];
    for (int t = 0; t < 4; t++)start[t] = temp[t];
}
int Min = 99999;
void abc(int level)
{
    if (start == target)
    {
        if (Min > level)Min = level;
        return;
    }
    if (level == 4)return;  // 주의: 설계시 리턴조건 잘 생각해서 주석달아 놓을 것
    lspin(); abc(level + 1); rspin();
    rspin(); abc(level + 1); lspin();
    tover(); abc(level + 1); tover();
}

int main()
{

    abc(0);
    cout << Min;
    return 0;
}

- 미로찾기 축소판 (출발지에서 도착지까지 갈수있는지 확인하기)

#include<iostream>
using namespace std;
int map[4][4] = {
    0,0,0,0,
    1,0,1,0,
    1,0,1,0,
    0,0,0,0,
};
int visit[4][4] = { 1 };
int flag;
int direct[4][2] = { -1,0,1,0,0,-1,0,1 };
void abc(int y, int x)
{
    if (y == 3 && x == 3)
    {
        flag = 1;
        return;
    }
    for (int t = 0; t < 4; t++)
    {
        int dy = y + direct[t][0];
        int dx = x + direct[t][1];
        // 배열범위
        if (dy < 0 || dx < 0 || dy>3 || dx>3)continue;
        // 벽
        if (map[dy][dx] == 1)continue;
        // visit
        if (visit[dy][dx] == 1)continue;
        visit[dy][dx] = 1;    
        abc(dy, dx);
    }
}

int main()
{
    abc(0, 0);   // 시작 좌표값
    if (flag)cout << "도착가능";
    else cout << "도착 불가능";
    return 0;
}

- 취객의 빠른길찾기 (DFS + direct)

#include <iostream>

using namespace std;

int map[5][4] = {
	3,2,4,1,
	0,1,0,5,
	2,0,3,0,
	5,4,0,2,
	2,5,0,3,
};

int Max = 0;

void run(int now, int le, int sum) {
	if (le == 5) {
		if (Max < sum) Max = sum;
		return;
	}

	for (int i = 0; i < 3; i++) {
		int direct[3] = { -1,0,1 }; //행은 레벨과 같음, 열은 행기준 direct
		int dy = le;
		int dx = direct[i] + now;
		if (dx < 0 || dx >= 4) continue; //dy는 레벨임으로 따로 조건 안줘도 됨
		if (map[dy][dx] == 0)continue; //0은 갈수없는길임으로 패스
		run(dx, le + 1, sum + map[dy][dx]);
	}
}

int main() {

	for (int i = 0; i < 4; i++) { // 1~4열 각각 출발하는경우마다 경로의 합이 달라짐 
		run(i, 0, 0); //now level sum
	}

	cout << Max;

	return 0;
}

- 1~9중 4등까지의 합이 10이하가되는 경우는 몇번?

#include <iostream>

using namespace std;

int used[10];
int cnt = 0;

void run(int le, int sum) {

	if (sum > 10)return;

	if (le == 4) {
		cnt++;
		return;
	}

	for (int i = 1; i < 10; i++) {
		if (used[i] == 1)continue;
		used[i] = 1;
		run(le + 1, sum + i);
		used[i] = 0;
	}
}

int main() {
	
	run(0,0);

	cout << cnt;

	return 0;
}

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14hwZqABsCFAYD&categoryId=AV14hwZqABsCFAYD&categoryType=CODE&problemTitle=1220&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

#include <iostream>
#include <vector>

using namespace std;

int cnt;
void check(vector<int>arr) {
	while (1) {
		if (arr.empty() || arr[0] == 1) break;
		arr.erase(arr.begin());
	}

	while (1) {
		if (arr.empty() || arr[arr.size()-1] == 2) break;
		arr.pop_back();
	}

	for (int i = 1; i < arr.size(); i++) { //N극에서 S극으로 바뀌는 횟수만 카운트
		if (arr[i - 1] == 1 && arr[i] == 2) cnt++;
	}

}

int main() {

	for (int i = 0; i < 10; i++)
	{
		cnt = 0;
		int map[100][100];
		int n;
		cin >> n;
		for (int y = 0; y < n; y++) {
			for (int x = 0; x < n; x++) {
				cin >> map[y][x];
			}
		}

		vector<int>tmp;
		for (int y = 0; y < n; y++) {
			for (int x = 0; x < n; x++) {
				if (map[x][y] != 0) tmp.push_back(map[x][y]);
			}
			check(tmp);
			tmp.clear();
		}

		cout << "#" << i + 1 << " " << cnt << endl;
		
		
	}

	return 0;
}

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14QpAaAAwCFAYi 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>

using namespace std;

int n;
int cnt = 0;
void check(string st) {
    int j = n / 2;

    for (int i = 0; i < j; i++) {
        if (st[i] != st[(n-1) - i]) return;
    }

    cnt++;
}

int main() {
    
    int sun = 0;
    for (int i = 0; i < 10; i++) {
        cnt = 0;
        sun++;

        cin >> n;

        char arr[8][8];
        for (int i = 0; i < 8; i++)
            cin >> arr[i];

        string tmp;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j <= 8 - n; j++) {
                for (int x = j; x < j + n; x++) {
                    tmp += arr[i][x];                   
                }
                check(tmp);
                tmp.clear();
            }
        }

        for (int i = 0; i <= 8- n; i++) {
            for (int j = 0; j < 8; j++) {
                for (int x = i; x < i + n; x++) {
                    tmp += arr[x][j];
                }
                check(tmp);
                tmp.clear();
            }
        }

        cout << "#" << sun << " "<< cnt << endl;
    }
    
    return 0;
}

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14eWb6AAkCFAYD

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

- vector 사용

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
 
using namespace std;
 
int main() {
 
    vector<char>arr1;
    vector<char>arr2;
    vector<char>arr3;
    vector<char>arr4;
 
    int sun = 0;
    for (int q = 0; q < 10; q++) {
        sun++;
 
        int cnt = 0;
        arr1.clear();
        arr2.clear();
        arr3.clear();
        arr4.clear();
 
        int n;
        cin >> n;
 
        string st;
        cin >> st;
 
        for (int i = 0; i < n; i++) {
            char now = st[i];
            if (st[i] == '(') arr1.push_back(1);
            if (st[i] == '[') arr2.push_back(1);
            if (st[i] == '{') arr3.push_back(1);
            if (st[i] == '<') arr4.push_back(1);
 
            if (st[i] == ')') {
                if (arr1.empty()) {
                    cnt++;
                    continue;
                }
                arr1.pop_back();
            }
            if (st[i] == ']') {
                if (arr2.empty()) {
                    cnt++;
                    continue;
                }
                arr2.pop_back();
            }
            if (st[i] == '}') {
                if (arr3.empty()) {
                    cnt++;
                    continue;
                }
                arr3.pop_back();
            }
            if (st[i] == '>') {
                if (arr4.empty()) {
                    cnt++;
                    continue;
                }
                arr4.pop_back();
            }
        }
 
 
        cnt += arr1.size();
        cnt += arr2.size();
        cnt += arr3.size();
        cnt += arr4.size();
 
        int result;
        if (cnt == 0) result = 1;
        else result = 0;
        cout << "#" << sun << " " << result << endl;
    }
     
    return 0;
}

 

- STL 사용하지않고 구현하기

#include<iostream>
using namespace std;
int heap[30];
int index;
void push(int value)
{
    // 1 번 인덱스 부터
    heap[++index] = value;      

// 부모 그리고 넘어온 값
int p, now; 
now = index;

while (1)
{
    // 부모 인덱스 확인
    p = now / 2;

    // 1번 인덱스만 체워짐
    if (now == 1)break;

    // 부모랑 들어온 값이랑 비교후 스왑
    if (heap[p] > heap[now])swap(heap[p], heap[now]);
    else break;

    // 부모를 기점으로 더 위(부모의 부모랑 비교)
    now = p;
}
}

int top()
{
    return heap[1];
}

void pop()
{
    // 맨 끝을 맨 위로 올리고
    heap[1] = heap[index];

//맨 끝값을 지우고
heap[index] = 0;
index--;


int p, son, son2;
p = 1;

while (1) {

    son = p * 2;  // 왼쪽자식
    son2 = son + 1;  // 오른쪽 자식

    // 오른쪽에 자식이 있고 자식들 비교해서 작은 자식을 = son
    if (son2 <= index && heap[son] > heap[son2])son = son2;

    //  배열에 마지막만 남거나 부모가 자식보다 작으면 break
    if (son > index || heap[p] < heap[son])break;
    else swap(heap[p], heap[son]);

    // 트리의 밑을 보기 (자식이 다시 부모가 되어서 체크)
    p = son;
}
}

int main()
{
    push(9);
    push(3);
    push(5);
    push(2);
    push(8);
    push(4);
    push(1);

for (int x = 0; x < 7; x++)
{
    cout << top() << " ";
    pop();
}

return 0;
}

- STL 사용하기

#include<iostream>
#include<queue>

using namespace std;

priority_queue<int,vector<int>,greater<int>>q; //오름차순
//priority_queue<int,vector<int>,less<int>>q; //max heap(내림차순)일경우 생략가능

int main() {
    q.push(4);
    q.push(14);
    q.push(44);
    q.push(64);
    q.push(43);
    q.push(24);

    int len = q.size();

    for (int i = 0; i < len; i++) {
        cout << q.top() << " ";
        q.pop();
    }

    return 0;
}

- operator 사용하기(우선순위 - 숫자 오름차순, 문자오름차순)

#include<iostream>
#include<queue>

using namespace std;

struct node {
    int num;
    char ch;
};

node vect[7] = {
    {3,'b'},
    {1,'k'},
    {5,'b'},
    {13,'a'},
    {1,'c'},
    {3,'a'},
    {1,'d'}
};

priority_queue<node>q;

// 첫번째 인자값의 우선순위가 더 낮다면 true를 반환
// sort랑 반대 주의!
bool operator<(node back, node front) {
    if (front.num < back.num) return true;
    if (front.num > back.num) return false;

    return front.ch < back.ch;

}

int main() {
    for (int x = 0; x < 7; x++) {
        q.push(vect[x]);
    }

    for (int x = 0; x < 7; x++) {
        cout << q.top().num << " " << q.top().ch << endl;
        q.pop();
    }

    return 0;
}

- 2차원배열의 값 큰것부터 위치 출력하기

#include<iostream>
#include<queue>

using namespace std;

struct node {
    int y, x;
    int num;
};

int map[3][3] = {
    4,7,3,
    1,94,5,
    6,2,8
};

priority_queue<node>q;

bool operator<(node back, node front) {
    return front.num < back.num;
}

int main() {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            q.push({ i,j,map[i][j] });
        }
    }

    for (int i = 0; i < 9; i++) {
        cout << q.top().y << " " << q.top().x << endl;
        q.pop();
    }

    return 0;
}

- *2, *3, *5 로 구현가능한 숫자중 n번째 수 찾기

#include<iostream>
#include<queue>
#include<vector>
#include<string>

using namespace std;

priority_queue<int, vector<int>, greater<int>>q;

vector<int>vect;

int main() {

    int n;
    cin >> n;

    q.push(1);
    int now;
    int before = 0;

    for (int x = 0; x < n; x++) {

        //중복제거
        while (1) {
            now = q.top();
            q.pop();

            if (now != before)break;
        }
        before = now;

        vect.push_back(now);

        q.push(now * 2);
        q.push(now * 3);
        q.push(now * 5);
    }

    cout << vect[n - 1];
   
    return 0;
}

Heap은 Data를 이진트리 형태로 저장해두고, 우선순위가 높은 값을 빠르게 찾아주는 자료구조 입니다.


다익스트라 알고리즘 - 경로가 양수로만 정해져있음( 갈수없는곳은 큰값으로 채움)

#include<iostream> // 다익스트라 n2
using namespace std;
char name[6] = "ABCDE";
const int m = 999;
int map[5][5] = {
    m,3,m,9,5,
    m,m,7,m,1,
    m,m,m,1,m,
    m,m,m,m,m,
    m,m,1,m,m,
};
int result[5] = {
    m,3,m,9,5,
};

int used[5] = { 1 };

int check()
{
    int Min = 21e8;
    int Minindex = 0;
    for (int x = 0; x < 5; x++)
    {
        if (used[x]==0 && result[x] < Min) {
            Min = result[x];
            Minindex = x;
        }
    }
    return Minindex;
 }
void daijk()
{
    for (int y = 0; y < 4; y++)
    {
        int via = check();  //   경유지 선택
        used[via] = 1;

    for (int x = 0; x < 5; x++)
    {
        int baro = result[x];
        int kyoung = result[via] + map[via][x];
        if (baro > kyoung)result[x] = kyoung;

    }

}
}
int main()
{

daijk();
char ends;
cin >> ends;
for (int x = 0; x < 5; x++)
{
    if (name[x] == ends)
    {
        cout << result[x];
        break;
    }
}

return 0;
}
#include<iostream>  //  다익스트라  nlogn

#include<queue>

#include<vector>
using namespace std;
char name[6] = "ABCDE";
struct node {
    int n;  // 인덱스
    int price;
};

vector<vector<node>>vect(5);

priority_queue<node>q;

int result[5] = { 999,999,999,999,999 };

int used[5];

bool operator<(node back, node front) // 우선순위 조건
{
    return front.price < back.price;
}

int main()
{
    // 인접 리스트
    vect[0].push_back({ 1,3 }); 
    vect[0].push_back({ 3,9 }); 
    vect[0].push_back({ 4,5 }); 
    vect[1].push_back({ 2,7 }); 
    vect[1].push_back({ 4,1 }); 
    vect[2].push_back({ 3,1 }); 
    vect[4].push_back({ 2,1 }); 

q.push({ 0,0 });

while (!q.empty())
{
    node via = q.top();
    q.pop();

    if (used[via.n] == 1)continue;
    used[via.n] = 1;

    // result  vs  경유지 거쳐서 가는 비용 비교후   result 갱신

    for (int x = 0; x < vect[via.n].size(); x++)
    {
        node target = vect[via.n][x];

        if (result[target.n] > via.price + target.price) {
            result[target.n] = via.price + target.price;
            q.push({ target.n,result[target.n] });
        }

    }



}


return 0;
}

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-OKAVYDFAUq&categoryId=AV5Pq-OKAVYDFAUq&categoryType=CODE&problemTitle=1961&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

- 2차원 vector배열 함수로 넘기기, clear사용, 90도 회전시 좌표변경식

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>

using namespace std;

int sun = 0;
int n;

vector<vector<string>> result(3);

void rotate(int index, vector<vector<int>>&arr) {

    vector<vector<int>> temp_arr(10, vector<int>(10));
    // 배열 90도 회전
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            temp_arr[i][j] = arr[abs(j - (n - 1))][i];
        }
    }
    
    arr = temp_arr;

    string tmp;
    for (int i = 0; i < n; i++) {
        for(int j=0; j<n; j++){
            tmp += to_string(arr[i][j]);
        }
        result[index].push_back(tmp);
        tmp.clear();
    }


}

void run() {
    sun++;
    cin >> n;

    vector<vector<int>> arr(n, vector<int>(n));

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> arr[i][j];
        }
    }

    for (int i = 0; i < 3; i++) {
        rotate(i, arr);
    }

    cout << "#" << sun << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 3; j++) {
            cout << result[j][i] << " ";
        }
        cout << endl;
    }
    
    for (int i = 0; i < 3; i++) {
        result[i].clear();
    }

}

int main() {
    int t;

    cin >> t;

    for (int i = 0; i < t; i++)
    {
        run();
    }
    
    return 0;
}

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13_BWKACUCFAYh&categoryId=AV13_BWKACUCFAYh&categoryType=CODE&problemTitle=1209&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
int arr[100][100];
 
int mmax;
 
void run() {
    int sum;
    int max = 0;
 
    for (int i = 0; i < 100; i++) { //입력
        for (int j = 0; j < 100; j++) {
            cin >> arr[i][j];
        }
    }
 
    for (int i = 0; i < 100; i++) { //가로줄
        sum = 0;
        for (int j = 0; j < 100; j++) {
            sum += arr[i][j];
        }
        if (sum > max) max = sum;
    }
 
    for (int i = 0; i < 100; i++) { //세로줄
        sum = 0;
        for (int j = 0; j < 100; j++) {
            sum += arr[j][i];
        }
        if (sum > max) max = sum;
    }
 
    sum = 0;
    for (int i = 0; i < 100; i++) { //대각선1
        sum += arr[i][i];
    }
    if (sum > max) max = sum;
 
 
    sum = 0;
    for (int i = 0; i < 100; i++) { //대각선2
        sum += arr[i][99-i];
    }
    if (sum > max) max = sum;
 
    mmax = max;
 
}
 
int main() {
    int sun;
 
    for (int i = 0; i < 10; i++)
    {
        cin >> sun;
        run();
        cout << "#" << sun << " " <<mmax << endl;
    }
     
    return 0;
}

+ Recent posts