• Sort(start, end): start ~ end 범위에 있는 인자를 오름차순(기본값)으로 정렬한다. 내림차순으로 정렬하고 싶으면 'greater<T>()'를 세번째 인자에 넣어준다.
  • begin(): 첫번째 요소의 주소를 반환
  • end(): 마지막 요소의 다음 주소를 반환

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

 

1427번: 소트인사이드

첫째 줄에 정렬하려고 하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    string n;
    cin >> n;
    sort(n.begin(), n.end(), greater<int>());
    cout << n;
}

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

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	int arr[10];
	int sum = 0;

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

	sort(arr, arr + 9);

	for (int i = 0; i < 9; i++)
	{
		for (int j = i + 1; j < 9; j++)
		{
			if (sum - (arr[i] + arr[j]) == 100)
			{
				for (int k = 0; k < 9; k++)
				{
					if (i == k || j == k)
						continue;
					cout << arr[k] << endl;
				}
				return 0;
			}
		}
	}
	return 0;
}

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

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int n;

    cin >> n;

	int* arr = new int[n];

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

	sort(arr, arr + n);

	for (int i = 0; i < n; i++)
	{
		cout << arr[i] << '\n';
	}
}

 


 

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

 

11004번: K번째 수

수 N개 A1, A2, ..., AN이 주어진다. A를 오름차순 정렬했을 때, 앞에서부터 K번째 있는 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

  • ios::sync_with_stdio(false): c 표준 stream과 c++ 표준 stream 동기화 끊기 - cin/cout 속도가 c의 입출력 속도에 비해 떨어지기 때문에 동기화를 비활성화함으로써 c++만의 독립적인 버퍼가 생성 -> 사용되는 버퍼 수 감소 -> 속도 향상
  • cin.tie(NULL): cin과 cout 묶음을 풀어줌 -> 입력 요청 전에 출력 작업이 있었을 경우 버퍼를 지우는 과정이 이루어지면서 시간이 오래 걸린다. 
#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);    
    cin.tie(NULL);

    int n, k;

    cin >> n >> k;

    int* arr = new int[n];

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

    sort(arr, arr + n);
    cout << arr[k-1];
}

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

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

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

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int n, x, y;

    cin >> n;

    vector<pair<int, int>> v;

    for (int i = 0; i < n; i++)
    {
        cin >> x >> y;
        v.push_back({ x, y });
    }

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

    for (int i = 0; i < n; i++)
    {
        cout << v[i].first << ' ' << v[i].second << '\n';
    }

}

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

 

11651번: 좌표 정렬하기 2

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

1. 사용자 정의 함수 Comp 만들어 sort()에 사용

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

using namespace std;

bool Comp(pair<int, int> p1, pair<int, int> p2) 
{
    if (p1.second < p2.second)
        return true;
    else if (p1.second == p2.second)
    {
        if (p1.first < p2.first)
            return true;
    }
    return false;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int n, x, y;

    cin >> n;

    vector<pair<int, int>> v;

    for (int i = 0; i < n; i++)
    {
        cin >> x >> y;
        v.push_back({ x, y });
    }

    sort(v.begin(), v.end(), Comp);

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

        cout << v[i].first << ' ' << v[i].second << '\n';
    }
}

2. y, x로 push_back

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

using namespace std;

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

    int n, x, y;

    cin >> n;

    vector<pair<int, int>> v;

    for (int i = 0; i < n; i++)
    {
        cin >> x >> y;
        v.push_back({ y, x });
    }

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

    for (int i = 0; i < n; i++)
    {
        cout << v[i].second << ' ' << v[i].first << '\n';
    }

}

 

 

  • sizeof(): 괄호 안에 들어간 자료형의 크기를 byte 단위로 구한다

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

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n, temp;
    cin >> n;
    int arr[1000];

    // 배열 입력
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }

	// 앞에 있는 수보다 뒤에 있는 수가 작으면 위치 바꿔줌
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (arr[i] > arr[j]) {
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
            }
        }
    }

    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << endl;
    }
}

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

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string str;

    // cin을 str에 저장하는 함수
    getline(cin, str);
    int cnt = 1;

    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] == ' ')
            cnt++;
    }

    if (str[0] == ' ')
        cnt--;

    if (str[str.length() - 1] == ' ')
        cnt--;

    cout << cnt;
}

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

 

11654번: 아스키 코드

알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    char input;
    cin >> input;

    int anwser = (int)input;
    //int anwser = int(input); ==> 같은 결과
    
    cout << anwser;
}

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

 

11721번: 열 개씩 끊어 출력하기

첫째 줄에 단어가 주어진다. 단어는 알파벳 소문자와 대문자로만 이루어져 있으며, 길이는 100을 넘지 않는다. 길이가 0인 단어는 주어지지 않는다.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    string str;
    cin >> str;

    for (int i = 0; i < str.length(); i++)
    {
        cout << str[i];
        if (i % 10 == 9) {
            cout << '\n';
        }
    }
}

 

 

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

 

2438번: 별 찍기 - 1

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int index;

	cin >> index;
	

	for (int i = 0; i < index; i++)
	{
		for (int j = 0; j < i + 1; j++)
		{
			cout << "*";
		}
		cout << endl;
	}
}

 


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

 

2739번: 구구단

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int dan;

	cin >> dan;
	

	for (int i = 1; i <= 9; i++)
	{
		cout << dan << " * " << i <<  " = " <<  dan * i << endl;
	}
	cout << endl;
}

 


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

 

2742번: 기찍 N

자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n;

    cin >> n;

    for (int i = n; i > 0; i--) {
        cout << i << "\n";
    }
}

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

 

2439번: 별 찍기 - 2

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n;

    cin >> n;

	for (int i = 1; i <= n; i++)
	{
		for (int k = 1; k <= n - i; k++) {
			cout << " ";
		}
		for (int j = 1; j < i + 1; j++) 
		{
			cout << "*";
		}
		cout << "\n";
	}
}

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

 

2440번: 별 찍기 - 3

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n;

    cin >> n;

    for (int i = 0; i < n; i++) {
        for (int j = n; j > i; j--) {
            cout << "*";
        }
        cout << "\n";
    }
}

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

 

2441번: 별 찍기 - 4

첫째 줄에는 별 N개, 둘째 줄에는 별 N-1개, ..., N번째 줄에는 별 1개를 찍는 문제 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n;

    cin >> n;

    for (int i = n; i > 0; i--) {
        for (int k = n; k > i; k--) {
            cout << " ";
        }
        for (int j = 0; j < i; j++) {
            cout << "*";
        }
        
        cout << "\n";
    }
}

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

 

9498번: 시험 성적

시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int score;

    cin >> score;

    if (score >= 90) {
        cout << "A";
    }
    else if (score >= 80) {
        cout << "B";
    }
    else if (score >= 70) {
        cout << "C";
    }
    else if (score >= 60) {
        cout << "D";
    }
    else
        cout << "F";
}

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

 

8393번: 합

n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n;
    int sum = 0;

    cin >> n;

    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    cout << sum;
}

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

 

1924번: 2007년

첫째 줄에 빈 칸을 사이에 두고 x(1 ≤ x ≤ 12)와 y(1 ≤ y ≤ 31)이 주어진다. 참고로 2007년에는 1, 3, 5, 7, 8, 10, 12월은 31일까지, 4, 6, 9, 11월은 30일까지, 2월은 28일까지 있다.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int month;
    int day;

    int daysOfMonth[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    string days[7] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };

    cin >> month >> day;

    for (int i = 1; i < month; i++) {
        day += daysOfMonth[i];
    }
    cout << days[day % 7];
}

 

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

 

10871번: X보다 작은 수

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

www.acmicpc.net

#include <iostream>

using namespace std;

int main()
{
    int n;
    int x;

    cin >> n >> x;

    int sequence[10000] = {};

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

    for (int i = 0; i < n; i++) {
        if (sequence[i] < x) {
            cout << sequence[i] << " ";
        }
    }
}

< Subingo >('https://hjkgame.tistory.com/54'이하 '무르르릉')은(는) 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다.

○ 이 개인정보처리방침은 2022년 11월 17부터 적용됩니다.

 

제1조(개인정보의 처리 목적)

< Subingo >('https://hjkgame.tistory.com/54'이하 '무르르릉')은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.



제2조(개인정보의 처리 및 보유 기간)

 < Subingo >은(는) 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유합니다.

② 각각의 개인정보 처리 및 보유 기간은 다음과 같습니다.

  • 1.<재화 또는 서비스 제공>
  • <재화 또는 서비스 제공>와 관련한 개인정보는 수집.이용에 관한 동의일로부터<1년>까지 위 이용목적을 위하여 보유.이용됩니다.
  • 보유근거 : 재화 또는 서비스 제공
  • 관련법령 : 1)신용정보의 수집/처리 및 이용 등에 관한 기록 : 3년
    2) 소비자의 불만 또는 분쟁처리에 관한 기록 : 3년
    3) 대금결제 및 재화 등의 공급에 관한 기록 : 5년
    4) 계약 또는 청약철회 등에 관한 기록 : 5년
    5) 표시/광고에 관한 기록 : 6개월
  • 예외사유 :



제3조(처리하는 개인정보의 항목)

 < Subingo >은(는) 다음의 개인정보 항목을 처리하고 있습니다.

  • 1< 재화 또는 서비스 제공 >
  • 필수항목 : 로그인ID
  • 선택항목 :



제4조(개인정보의 제3자 제공에 관한 사항)

 < Subingo >은(는) 개인정보를 제1조(개인정보의 처리 목적)에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다.

 < Subingo >은(는) 다음과 같이 개인정보를 제3자에게 제공하고 있습니다.

  • 1. < Subingo >
  • 개인정보를 제공받는 자 : Subingo
  • 제공받는 자의 개인정보 이용목적 :
  • 제공받는 자의 보유.이용기간: 1년



제5조(개인정보처리의 위탁에 관한 사항)

 < Subingo >은(는) 원활한 개인정보 업무처리를 위하여 다음과 같이 개인정보 처리업무를 위탁하고 있습니다.

  • 1. < Subingo >
  • 위탁받는 자 (수탁자) :
  • 위탁하는 업무의 내용 :
  • 위탁기간 :

 < Subingo >은(는) 위탁계약 체결시 「개인정보 보호법」 제26조에 따라 위탁업무 수행목적 외 개인정보 처리금지, 기술적․관리적 보호조치, 재위탁 제한, 수탁자에 대한 관리․감독, 손해배상 등 책임에 관한 사항을 계약서 등 문서에 명시하고, 수탁자가 개인정보를 안전하게 처리하는지를 감독하고 있습니다.

③ 위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다.



제6조(개인정보의 파기절차 및 파기방법)


① < Subingo > 은(는) 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다.

② 정보주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다.
1. 법령 근거 :
2. 보존하는 개인정보 항목 : 계좌정보, 거래날짜

③ 개인정보 파기의 절차 및 방법은 다음과 같습니다.
1. 파기절차
< Subingo > 은(는) 파기 사유가 발생한 개인정보를 선정하고, < Subingo > 의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다.

2. 파기방법

전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다



제7조(정보주체와 법정대리인의 권리·의무 및 그 행사방법에 관한 사항)



① 정보주체는 Subingo에 대해 언제든지 개인정보 열람·정정·삭제·처리정지 요구 등의 권리를 행사할 수 있습니다.

② 제1항에 따른 권리 행사는Subingo에 대해 「개인정보 보호법」 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 Subingo은(는) 이에 대해 지체 없이 조치하겠습니다.

③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.이 경우 “개인정보 처리 방법에 관한 고시(제2020-7호)” 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다.

④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한 될 수 있습니다.

⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다.

⑥ Subingo은(는) 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다.



제8조(개인정보의 안전성 확보조치에 관한 사항)

< Subingo >은(는) 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다.

1. 내부관리계획의 수립 및 시행
개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다.



제9조(개인정보를 자동으로 수집하는 장치의 설치·운영 및 그 거부에 관한 사항)



Subingo 은(는) 정보주체의 이용정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용하지 않습니다.

제10조 (개인정보 보호책임자에 관한 사항)

 Subingo 은(는) 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다.

  • ▶ 개인정보 보호책임자
  • 성명 :김현정
  • 직책 :팀장
  • 직급 :팀장
  • 연락처 :01031792754, hjk2754@gmail.com,

※ 개인정보 보호 담당부서로 연결됩니다.

  • ▶ 개인정보 보호 담당부서
  • 부서명 :
  • 담당자 :
  • 연락처 :, ,

② 정보주체께서는 Subingo 의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. Subingo 은(는) 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다.

제11조(개인정보의 열람청구를 접수·처리하는 부서)
정보주체는 「개인정보 보호법」 제35조에 따른 개인정보의 열람 청구를 아래의 부서에 할 수 있습니다.
< Subingo >은(는) 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다.

  • ▶ 개인정보 열람청구 접수·처리 부서
  • 부서명 :
  • 담당자 :
  • 연락처 : , ,



제12조(정보주체의 권익침해에 대한 구제방법)



정보주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다. 이 밖에 기타 개인정보침해의 신고, 상담에 대하여는 아래의 기관에 문의하시기 바랍니다.

1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr)
2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr)
3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr)
4. 경찰청 : (국번없이) 182 (ecrm.cyber.go.kr)

「개인정보보호법」제35조(개인정보의 열람), 제36조(개인정보의 정정·삭제), 제37조(개인정보의 처리정지 등)의 규정에 의한 요구에 대 하여 공공기관의 장이 행한 처분 또는 부작위로 인하여 권리 또는 이익의 침해를 받은 자는 행정심판법이 정하는 바에 따라 행정심판을 청구할 수 있습니다.

※ 행정심판에 대해 자세한 사항은 중앙행정심판위원회(www.simpan.go.kr) 홈페이지를 참고하시기 바랍니다.

제13조(개인정보 처리방침 변경)

 

① 이 개인정보처리방침은 2022년 11월 17부터 적용됩니다.

② 이전의 개인정보 처리방침은 아래에서 확인하실 수 있습니다.

예시 ) - 20XX. X. X ~ 20XX. X. X 적용 (클릭)

예시 ) - 20XX. X. X ~ 20XX. X. X 적용 (클릭)

예시 ) - 20XX. X. X ~ 20XX. X. X 적용 (클릭)

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

문제

철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일수를 알고 싶어 한다.

토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다.

입력

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.

토마토가 하나 이상 있는 경우만 입력으로 주어진다.

출력

여러분은 토마토가 모두 익을 때까지의 최소 날짜를 출력해야 한다. 만약, 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다.

예제 입력 1 복사

6 4
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

예제 출력 1 복사

8

풀이

  • 하루가 지나면 익은 토마토의 인접한 토마토(상하좌우)가 익는다. -> 익은 토마토(1)를 큐에 넣고 주변에 익지 않은 토마토가 있으면 해당 위치값을 1(하루) 증가시킨다: 
  • 큐에 남은 게 없을 때까지 BFS를 실행하게 되면 아래 그림과 같은 모습이 된다.

  • 1인 값부터 시작했기 때문에 배열에서 가장 큰 수를 찾아 -1을 빼주면 토마토가 모두 익은 일수를 구할 수 있다.

코드

from collections import deque;

# 상하좌우 방향 벡터
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

check = 0   # 익지 않은 토마토(0)가 있다면 1을 넘겨줌
max = 0     # 최대 일수

def Bfs():
    # 값이 1인 곳의 상하좌우 탐색
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                continue
            # 해당 위치의 상하좌우의 값이 0(익지 않은 토마토)일 때 해당 값을 증가시켜서 최대 일수를 구함
            if board[nx][ny] == 0:
                q.append((nx, ny))
                board[nx][ny] = board[x][y] + 1

if __name__ == "__main__":
    # M: 가로, N: 세로
    M, N = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(N)]
    q = deque()

    # 맵에서 1인 곳을 찾아 큐에 담고 BFS 실행
    for i in range(N):
        for j in range(M):
            if board[i][j] == 1:
                q.append((i, j))

    Bfs()

    # BFS가 끝난 후 2차원 배열에 0이 존재할 경우 
    for i in range(N):
        for j in range(M):
            # 익지 않은 토마토가 있으면 check 변수에 1 담고 이 값이 1일 때 -1 출력
            if board[i][j] == 0:
                check = 1
            
            # 가장 큰 값 max 변수에 담기
            if max < board[i][j]:
                max = board[i][j]

    # 출력하는 부분
    if check == 1:
        print(-1)
    else:
        print(max-1)

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

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

문제

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

예를 들어, 그림이 아래와 같은 경우에

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)

그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

둘째 줄부터 N개 줄에는 그림이 주어진다.

출력

적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

예제 입력 1 복사

5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

예제 출력 1 복사

4 3

풀이

  • BFS 이용(DFS도 사용 가능)
  • 색약이 있는 사람들은 R, G를 모두 똑같은 색으로 인식한다. -> 'G'을 'R'로 변경('R' -> 'G'도 가능)
  • BFS 함수에서 상하좌우의 값을 확인하고 동일하면 큐에 집어 넣는다. 그래프의 모든 값을 확인하고 영역의 수를 구해야하는 문제이기 때문에 상하좌우의 값이 현재 큐에서 꺼낸 좌표에 들어있는 값과 같다면 큐에 넣은 후 다시 주변을 탐색한다.

!! 처음에는 BFS 함수의 매개변수로 색깔값을 받아왔는데, 이는 모든 값을 확인해줘야 하기 때문에 코드가 지저분하고 반복적인 부분이 많았다. 코드를 계속 치면서도 내가 조금 이상하고 복잡하게 풀고 있다는 느낌을 받았었는데 역시나 잘못된 방법이었다.

수정 전

def Bfs(x, y, color):
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if board[nx][ny] == color and not visited[nx][ny]:
                q.append((nx, ny))
                visited[nx][ny] = True

수정 후

def Bfs(x, y):
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if board[nx][ny] == board[x][y] and not visited[nx][ny]:
                q.append((nx, ny))
                visited[nx][ny] = True
  • 위 코드를 이용하면 메인 코드에서 방문 여부만 판단하여 그래프를 탐색할 수 있다.
  • 색약의 유무에 따라 영역의 수를 출력 -> BFS 2번 사용해야 하며 이때 방문 그래프와 영역의 수를 초기화한 뒤 BFS를 실행해야 한다.

코드

from collections import deque;

# 상하좌우 방향벡터
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

# 영역의 수
cnt = 0

def Bfs(x, y):
    q = deque()
    q.append((x, y))
    visited[x][y] = True

    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx >= N or ny < 0 or ny >= N:
                continue
            # 현재 값과 상하좌우 값 비교하여 같으면 큐에 집어 넣고 방문 처리를 해주는 부분
            if board[nx][ny] == board[x][y] and not visited[nx][ny]:
                q.append((nx, ny))
                visited[nx][ny] = True

if __name__ == "__main__":
    N = int(input())
    board = [list(input().strip()) for _ in range(N)]
    visited = [[False] * N for _ in range(N)]

    # 적록색약이 아닐 때
    for i in range(N):
        for j in range(N):
            if not visited[i][j]:
                Bfs(i, j)
                cnt += 1
    
    # 줄바꿈X 공백 구분 위해 end=' ' 사용
    print(cnt, end=' ')

    # 적록색약일 때: G를 R로 변경해준 뒤 탐색
    for i in range(N):
        for j in range(N):
            if board[i][j] == 'G':
                board[i][j] = 'R'

    # 방문 배열, 영역의 수 초기화
    visited = [[False] * N for _ in range(N)]
    cnt = 0

    for i in range(N):
        for j in range(N):
            if not visited[i][j]:
                Bfs(i, j)
                cnt += 1

    print(cnt)

 

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

 

1926번: 그림

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로

www.acmicpc.net

문제

어떤 큰 도화지에 그림이 그려져 있을 때, 그 그림의 개수와, 그 그림 중 넓이가 가장 넓은 것의 넓이를 출력하여라. 단, 그림이라는 것은 1로 연결된 것을 한 그림이라고 정의하자. 가로나 세로로 연결된 것은 연결이 된 것이고 대각선으로 연결이 된 것은 떨어진 그림이다. 그림의 넓이란 그림에 포함된 1의 개수이다.

입력

첫째 줄에 도화지의 세로 크기 n(1 ≤ n ≤ 500)과 가로 크기 m(1 ≤ m ≤ 500)이 차례로 주어진다. 두 번째 줄부터 n+1 줄 까지 그림의 정보가 주어진다. (단 그림의 정보는 0과 1이 공백을 두고 주어지며, 0은 색칠이 안된 부분, 1은 색칠이 된 부분을 의미한다)

출력

첫째 줄에는 그림의 개수, 둘째 줄에는 그 중 가장 넓은 그림의 넓이를 출력하여라. 단, 그림이 하나도 없는 경우에는 가장 넓은 그림의 넓이는 0이다.

예제 입력 1 복사

6 5
1 1 0 1 1
0 1 1 0 0
0 0 0 0 0
1 0 1 1 1
0 0 1 1 1
0 0 1 1 1

예제 출력 1 복사

4
9

풀이

  • DFS 이용한 배열 탐색
  • 대각선으로 이어진 그림은 떨어진 그림 -> 상하좌우 방향벡터 이용하여 주변값 확인
  • 배열에 존재하는 그림 중 가장 넓은 그림을 출력하기 위해 배열에 넓이를 저장, max() 사용하여 출력

!! 런타임 에러(ValueError) 발생

result = []

print(max(result))

그림의 넓이를 담기 위해 result 배열을 생성 -> 해당 배열의 길이 0

max() 사용 시 배열이 비어있기 때문에 런타임 에러 발생

 

해결 방법

# 1. 배열이 비어있지 않도록 0 집어넣기
result = [0]

# 2. 출력할 때 예외 조건 부여하기
if len(result) == 0:
    print(0)
    print(0)
else:
    print(cnt)
    print(max(result))

 

코드

from collections import deque

# 상하좌우 방향벡터
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

# 넓이 저장 배열
result = []

# 그림의 개수
cnt = 0

def Dfs(x, y):
    area = 1                # 그림의 넓이
    q = deque()
    q.append((x, y))        # 좌표 데크에 넣어 저장
    visited[x][y] = True    # 방문 처리


    while q:
        x, y = q.pop()
        # 상하좌우 탐색해서 그림이 존재하면 데크에 위치값 저장 후 그림 넓이 1 증가
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx >= r or ny < 0 or ny >= c:
                continue
            if board[nx][ny] == 1 and not visited[nx][ny]:
                q.append((nx, ny))
                visited[nx][ny] = True
                area += 1
    return area


if __name__ == "__main__":
    # r: 열, c: 행
    r, c = map(int, input().split())
    board = [list(map(int, input().split())) for _ in range(r)]     # 한줄씩 값 채워넣기
    visited = [[False] * c for _ in range(r)]                       # 방문 배열

    for i in range(r):
        for j in range(c):
            if board[i][j] == 1 and not visited[i][j]:
                result.append(Dfs(i, j))                # 그림 넓이 저장
                cnt += 1                                # 그림 개수 증가
                visited[i][j] = True                    # 방문 처리
    
    # 그림이 없을 때는 그림의 넓이를 0으로 처리
    if len(result) == 0:
        print(0)
        print(0)
    else:
        print(cnt)
        print(max(result))

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

 

1743번: 음식물 피하기

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다

www.acmicpc.net

 

문제

코레스코 콘도미니엄 8층은 학생들이 3끼의 식사를 해결하는 공간이다. 그러나 몇몇 비양심적인 학생들의 만행으로 음식물이 통로 중간 중간에 떨어져 있다. 이러한 음식물들은 근처에 있는 것끼리 뭉치게 돼서 큰 음식물 쓰레기가 된다. 

이 문제를 출제한 선생님은 개인적으로 이러한 음식물을 실내화에 묻히는 것을 정말 진정으로 싫어한다. 참고로 우리가 구해야 할 답은 이 문제를 낸 조교를 맞추는 것이 아니다. 

통로에 떨어진 음식물을 피해가기란 쉬운 일이 아니다. 따라서 선생님은 떨어진 음식물 중에 제일 큰 음식물만은 피해 가려고 한다. 

선생님을 도와 제일 큰 음식물의 크기를 구해서 “10ra"를 외치지 않게 도와주자.

입력

첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다.  그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다.

좌표 (r, c)의 r은 위에서부터, c는 왼쪽에서부터가 기준이다. 입력으로 주어지는 좌표는 중복되지 않는다.

출력

첫째 줄에 음식물 중 가장 큰 음식물의 크기를 출력하라.

 

예제 입력 1 복사

3 4 5
3 2
2 2
3 1
2 3
1 1

예제 출력 1 복사

4

힌트

# . . .
. # # .
# # . .

위와 같이 음식물이 떨어져있고 제일큰 음식물의 크기는 4가 된다. (인접한 것은 붙어서 크게 된다고 나와 있음. 대각선으로는 음식물 끼리 붙을수 없고 상하좌우로만 붙을수 있다.)


풀이

  •  BFS 사용하여 음식물의 개수 배열에 저장
  • 대각선으로는 음식물 덩어리가 될 수 없으므로 상하좌우 방향벡터 정의하여 탐색
  • 음식물이 존재할 때, 영역에 존재하는 음식물 개수를 증가하여 반환
  • 영역에 존재하는 총 음식물 개수(크기)를 배열에 담고 max 함수 사용하여 가장 큰 음식물 크기 출력

코드

from collections import deque;

#  상하좌우 방향벡터
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

# 음식물 담을 리스트
result = []

def Bfs(x, y):
    cnt = 1
    q = deque()
    q.append((x, y))
    visited[x][y] = True

    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            # 탐색 범위 제한
            if nx < 0 or nx >= N or ny < 0 or ny >= M:
                continue
            # 음식물 쓰레기가 있고 방문하지 않았다면 개수 증가
            if board[nx][ny] == '#' and not visited[nx][ny]:
                q.append((nx, ny))
                visited[nx][ny] = True
                cnt += 1
    return cnt

if __name__ == "__main__":
    # N: 세로 M: 가로 K: 음식물 개수
    N, M, K = map(int, input().split())
    board = [['.'] * M for _ in range(N)]
    visited = [[False] * M for _ in range(N)]

    # 음식물 위치 받아오기
    # r, c는 좌표이므로 배열의 인덱스를 받아오기 위해 -1 해준다
    for _ in range(K):
        r, c = map(int, input().split())
        board[r-1][c-1] = '#'

    for i in range(N):
        for j in range(M):
            # 음식물 있으면 배열에 음식물 개수 저장
            if board[i][j] == '#' and not visited[i][j]:
                result.append(Bfs(i, j))

    # 배열에서 가장 큰 음식물 출력
    print(max(result))

+ Recent posts