Old/백준
![백준 1074번 Z // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHEVYc%2FbtqCrkVSvHA%2Fyr5OF0uDmYMUoMDAQfNuh1%2Fimg.jpg)
백준 1074번 Z // C++
문제 한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 배열의 크기가 2^N * 2^N라서 왼쪽 위에 있는 칸이 하나가 아니라면, 배열을 4등분 한 후에 (크기가 같은 2^(N-1)로) 재귀적으로 순서대로 방문한다. 다음 예는 2^2 * 2^2 크기의 배열을 방문한 순서이다. N이 주어졌을 때, (r, c)를 몇 번째로 방문하는지 출력하는 프로그램을 작성하시오. 다음 그림은 N=3일 때의 예이다. 입력 첫째 줄에 N r c가 주어진다. N은 15보다 작거나 같은 자연수이고, r과 c는 0보다 크거나 같고, 2^N-1보다 작거나 같은 정수이다 출력..
![백준 5525번 IOIOI // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoAc8t%2FbtqCnZ6mIpD%2FLFDH6Wt94DRIIZRYeOLiYk%2Fimg.jpg)
백준 5525번 IOIOI // C++
문제 N+1개의 I와 N개의 O로 이루어져 있으면, I와 O이 교대로 나오는 문자열을 PN이라고 한다. P1 IOI P2 IOIOI P3 IOIOIOI PN IOIOI...OI (O가 N개) I와 O로만 이루어진 문자열 S와 정수 N이 주어졌을 때, S안에 PN이 몇 군데 포함되어 있는지 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. 둘째 줄에는 S의 길이 M이 주어지며, 셋째 줄에 S가 주어진다. (1 ≤ N ≤ 1,000,000, 2N+1 ≤ M ≤ 1,000,000) 출력 S에 PN이 몇 군데 포함되어 있는지 출력한다. 풀이 처음엔 find 함수를 써서 해당 문자열이 몇 번 나오는지 세려고 했는데 시간 초과가 발생했다. 따라서 IOI가 연속해서 나오는 횟수를 각각 세주면서, 패턴에 ..
![백준 1931번 회의실 배정 // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkhkZ1%2FbtqCpPB6CR3%2FXlVd7DVbTCj8SOhgoLkN31%2Fimg.jpg)
백준 1931번 회의실 배정 // C++
문제 한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의들에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다. 입력 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 ..
![백준 1780번 종이의 개수 // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6YbtO%2FbtqCuZpCsaQ%2FMmkokKfp3oAKJVCLQjgZU0%2Fimg.png)
백준 1780번 종이의 개수 // C++
문제 N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다. 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다. (1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다. 이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으로만 채워진 종이의 개수, 1로만 채워진 종이의 개수를 구해내는 프로그램을 작성하시오. 입력 첫째 줄에 N(1≤N≤3^7, N은 3^k 꼴)이 주어진다. 다음 N개의 줄에는 N개의 정수로 행렬이 주어진다. 출력 첫째 줄에 -1로만 채워진 종이의 개수..
![백준 1676번 팩토리얼 0의 개수 // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpcBou%2FbtqCqMLPJqC%2FyAhPQv9yVkdrYwNXoObzr1%2Fimg.jpg)
백준 1676번 팩토리얼 0의 개수 // C++
문제 N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500) 출력 첫째 줄에 구한 0의 개수를 출력한다. 풀이 제일 뒤에 0의 개수는, n!에서 2와 5의 개수 중 작은 값이다. 따라서, n까지의 수에서 2와 5가 나오는 횟수를 각각 세어서 그 중 더 작은 값을 출력하면 된다. 코드 더보기 #include #include using namespace std; int solve(); int N; int two[501] = { 0, }; int five[501] = { 0, }; int main() { cin >> N; cout
![백준 1541번 잃어버린 괄호 // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6gktq%2FbtqCsIomdi8%2FNphkDdL15fotjShrbKwWT1%2Fimg.png)
백준 1541번 잃어버린 괄호 // C++
문제 세준이는 양수와 +, -, 그리고 괄호를 가지고 길이가 최대 50인 식을 만들었다. 그리고 나서 세준이는 괄호를 모두 지웠다. 그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다. 괄호를 적절히 쳐서 이 식의 값을 최소로 만드는 프로그램을 작성하시오. 입력 첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다 많이 연속되는 숫자는 없다. 수는 0으로 시작할 수 있다. 출력 첫째 줄에 정답을 출력한다. 풀이 값을 최소로 만들기 위해서는 -가 나올 경우 다음 -가 나오기 전까지 괄호를 쳐주면 된다. 그렇게 하면 괄호 안의 수의 합을 빼게..
![백준 11727번 2xN 타일링 2 // C++](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0qC3E%2FbtqCsGxlgjU%2FWat5lLNydQVppfK4VuVVm0%2Fimg.gif)
백준 11727번 2xN 타일링 2 // C++
문제 2×n 직사각형을 2×1과 2×2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×17 직사각형을 채운 한가지 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 풀이 arr[n]을 구하는 방법은, 11726번 문제에서 2X2 타일이 생긴것만 수정하면 된다. 2X1 타일 두개가 제일 앞인 경우, 2X2 타일로 수정이 가능하므로 arr[n] = arr[n-1] + (arr[n-2] * 2)가 된다. 이 문제도 arr[n]을 구할 때마다 10007로 나누어 줘야한다! 코드 더보기 #include using namespace std; int arr[1001]; i..
![백준 11726번 2xN 타일링](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUUy5V%2FbtqCrkBs03r%2FPeQtujRYkkkKync7hdk9A0%2Fimg.png)
백준 11726번 2xN 타일링
문제 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다. 입력 첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000) 출력 첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다. 풀이 arr[n]을 구하는 방법은 제일 앞의 타일이 1X2 타일인 경우와, 2X1 타일인 경우의 합으로, 피보나치 수열과 같다. N의 최대가 1000이고, 연산 도중에 int 범위를 벗어날 수 있으므로 항상 10007로 나누어 주자! 코드 더보기 #include using namespace std; int arr[1001]; int main() { int N; cin >> N;..