문제 : https://www.acmicpc.net/problem/1766


위상정렬 , 그래프이론

● 위상정렬 + 추가조건이 붙은 문제로 자료구조 우선순위 큐를 이용하면 쉽게 해결할 수 있습니다.

입력을 받아 x문제와 y문제가 선행 조건이 x가 먼저 풀려야되면 x에서 y로 가는 방향 간선을 그려주고

y의 inDegree 값을 증가시킵니다.

inDegree가 0이라는 뜻은 먼저 풀려야되는 문제가 없다는 뜻으로 지금 당장 풀어도 됩니다. 하지만, 우리는 풀어도 되는 문제 중 난이도가 작은(문제 번호가 작은) 문제를 먼저 풀어야되므로, 가장 작은 값에 우선 순위를 부여하는 우선순위 큐를 만들어 활용하면 됩니다.

inDegree가 0인 문제들을 모두 우선순위 큐에 넣고 하나씩 뽑아가며(가장 번호가 작은 문제) 출력하고, 해당 문제랑 연결되어 있는 문제들의 inDegree 값을 갱신해줍니다. 다시 inDegree가 0이 되는 문제들을 우선순위 큐에 넣어가며 모든 문제들을 출력하면 됩니다.

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

using namespace std;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);

	int N, M, inDegree[32001] = {};
	vector<int> graph[32001] = {};
	priority_queue<int, vector<int>, greater<int>> pq;

	cin >> N >> M;
	for (int i = 0, x, y; i < M; i++) {
		cin >> x >> y;
		graph[x].push_back(y);
		inDegree[y]++;
	}
	for (int i = 1; i <= N; i++)
		if (inDegree[i] == 0)
			pq.push(i);

	while (!pq.empty()) {
		int cur = pq.top();
		pq.pop();
		for (int i = 0; i < graph[cur].size(); i++) {
			inDegree[graph[cur][i]]--;
			if (inDegree[graph[cur][i]] == 0)
				pq.push(graph[cur][i]);
		}
		cout << cur << ' ';
	}

	return 0;
}

 

 안녕하세요, 여행벌입니다.

 오늘은 블록 레벨 태그와 인라인 레벨 태그는 어떤 특징을 가지고, 블록 레벨 태그에는 어떤 태그들이 있고 인라인 레벨 태그에는 어떤 태그들이 있는지 알아보겠습니다.


블록 레벨 요소(block-level element)

 블록 레벨 요소는 태그를 사용해 삽입했을 때, 혼자 한 줄을 차지하는 요소입니다. 한 줄을 차지한다는 것을 해당 요소의 너비가 100%라는 의미입니다. 따라서 그 요소의 왼쪽이라 오른쪽에 다른 요소가 올 수 없습니다. 너비나 마진, 패딩 등을 이용해 크기나 위치를 지정하려면 블록 레벨 요소여야 합니다.

● width, margin, height 속성을 정의하면 블록 레벨 요소는 모두 적용됩니다.

→ 화면 구성이나 레이아웃을 짤 때는 블록 레벨 요소를 사용.


인라인 레벨 요소(inline-level element)

 인라인 레벨 요소는 줄을 차지하지 않는 요소입니다. 즉 화면에 표시되는 콘텐츠만큼만 영역을 차지하고 나머지 공간에는 다른 요소가 올 수 있습니다. 따라서, 한 줄에 여러 개의 인라인 레벨 요소를 표시할 수 있습니다.

● margin은 상 / 하에 적용되지 않습니다. line-height 속성 이용.

● width, height 속성이 적용되지 않습니다.

● 인라인 속성을 가진 태그끼리 연속으로 사용되는 경우 최소한의 간격을 유지하기 위해 자동으로 외부 여백이 발생합니다.


블록 레벨 태그 / 인라인 레벨 태그

블록 레벨

<p> <h1>~<h6> <ul> <ol> <div> <blockquote> <form> <hr> <table> <filedset> 등

인라인 레벨

<img> <object> <br> <sub> <sup> <span> <input> <textarea> <label> <button>


예시

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>으갸갸갸갸갹</title>
    <style>
        .block{
            display : block;
            border : 1px solid red;
            margin : 10px;
            height : 50px;
            width : 200px;
            font-size : 2.5em;
        }
        .inline{
            display : inline;
            border : 1px solid blue;
            height : 50px; /* 속성 적용 x */
            width : 200px; /* 속성 적용 x */
        }
    </style>
</head>
<body>
    <div class="block">블록1</div>
    <div class="inline">인라인1</div>
    <div class="inline">인라인2</div>
    <div class="inline">인라인3</div>
    <a href="">인라인 옆에 a태그 추가하기.</a>
    <div class="block">블록2</div>
    <div class="inline">인라인4</div>
    <div class="block">블록3</div>
</body>

</html>

 블록 태그는 혼자 한 줄을 다 차지하기 때문에 블록1 다음에 오는 인라인1, 인라인2, 인라인3 태그가 블록1 옆이 아닌 아래에 한 줄로 나타나는 것을 볼 수 있습니다. 또, 인라인3 옆에 인라인 레벨 태그인 a 태그를 추가해도 다 같이 인라인 레벨이라 줄 바꿈이 없는 것을 확인할 수 있습니다. 


 

안녕하세요, 여행벌입니다.

이번 포스팅에서는 HTML의 요소 구조와 기본 규칙에 대해서 알아보겠습니다.


HTML 요소 / 기본 규칙

HTML 은 웹 문서에 마크업하는 언어입니다. 어디가 이미지이고 어디가 텍스트인지 표시하는 것을 마크업이라고 하는데, 마크업할 때 사용하는 약속된 표기법을 '태그' 라고 합니다. 태그는 위와 같은 구조로 작성을 해야 하고 다음과 같은 규칙이 있습니다.

● 태그는 < 와 > 를 이용해 구분합니다.

● 태그는 소문자로 씁니다.

● 시작 태그와 종료 태그를 정확히 입력해야 합니다. 종료 태그가 필요 없는 태그들도 있지만, 대부분 시작 태그와 종료 태그가 쌍을 이룹니다.

● HTML 요소는 여러 속성을 가질 수 있습니다.

● 속성은 HTML 요소의 시작 태그 내에서만 정의합니다. 

● 속성 값은 따옴표로 감싸줘야 합니다. HTML5 표준에서는 속성 값에 따옴표 사용을 강제하지는 않으나 감싸야만 하는 경우가 종종 있으므로 항상 따옴표를 사용하는 습관을 들이는 게 좋습니다.


 

 

문제 : https://www.acmicpc.net/problem/15666


[ 알고리즘풀이 ]

 중복해서 숫자를 사용할 수 있으므로, 사용할 수 있는 숫자들만 따로 check해 list를 오름차순으로 만들고 Backtracking 기법을 이용해 M개의 숫자를 뽑는데, 가장 마지막에 뽑은 숫자도 같이 매개변수로 넘겨주면서 그 값보다 크거나 같은 값들만 뽑는다.

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

int N, M;
bool check[10001];
vector<int> list;

void BT(vector<int> v, int start) {
	if (v.size() == M) {
		for (int i = 0; i < M; i++)
			cout << v[i] << ' ';
		cout << '\n';
		return;
	}
	for (int i = 0; i < list.size(); i++) {
		if(start <= list[i]){
			v.push_back(list[i]);
			BT(v, list[i]);
			v.pop_back();
		}
	}
}
int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> N >> M;
	for (int i = 0, x; i < N; i++) {
		cin >> x;
		check[x] = 1;
	}
	for (int i = 0; i < 10001; i++)
		if (check[i])
			list.push_back(i);

	sort(list.begin(), list.end());

	vector<int> v;
	BT(v, 0);

	return 0;
}

 

+ Recent posts