목록Algorithm & Test/백준 (29)
Priceless

체스에서 나이트의 움직임을 오른쪽으로만 움직였을 때 입력 받은 체스판에서 최대한의 이동하는 칸의 수를 구하는 문제다 체스판이 작을 때 이동 횟수에 대한 제한 있기 때문에 그 부분에 대해서 하나씩 조건을 걸어야 한다 체스판이 커지면 최대로 갈 수 있는 칸을 세기 위해 계산한다 자세한 계산 수는 코드를 참고한다 // baekjoon 1783 #include #include #include using namespace std; // codes for fast I/O void init(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); } int main(){ init(); int n, m; cin >> n >> m; if(n == 1){ cout

특별한 예외 처리가 필요할 줄 알았지만 생각보다 너무 쉬워서 빨리 해결할 수 있었다 개수가 적은 수를 바꿔야 하므로 값이 바뀌는 횟수를 세고 난 후 절반을 나누면 된다 // baekjoon 1439 #include #include #include using namespace std; // codes for fast I/O void init(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); } int main(){ init(); string input; cin >> input; int temp = input[0]; int n = input.length(); int switching = 0; for(int i = 1; i < n; i++){ if ..

그리디 알고리즘으로 푸는 문제 그리디 알고리즘으로 발제를 진행한 후, 원리나 작동 방식은 이해했지만 정작 코딩 경험이 부족했다 이해한 부분을 코드로 풀어쓰는 게 쉽지 않아 쉬운 문제부터 차근차근 풀어보기로 했다 0을 입력 받기 전까지 수 3개를 입력 받는다 최대 기간(p) 중 연속으로 사용 가능한 날짜(l)을 입력 받고 전체 휴가 기간(v)을 입력 받는다 우선 전체 휴가 기간 중 최대 기간만큼 나눈 몫만큼은 사용 가능한 것이 보장되어 있으니 나눈 몫에 연속으로 사용가능한 날짜를 곱해 사용 가능한 날짜를 저장한다 그 다음 몫으로 나눈 나머지에 대해 연속으로 사용 가능한 날짜보다 큰 경우 최대로 연속으로 사용 가능한 날짜를 더하고 연속으로 사용 가능한 날짜보다 작은 경우 남은 날짜만큼 더하서 완성한다 // ..

string과 char를 잘 이용하면 되는 문제 string으로 입력을 받은 뒤 정렬 과정을 거쳐 하나씩 출력하면 된다 숫자를 입력 받아 자릿수마다 나누는 방식으로 접근할 수도 있지만 확실히 자릿수를 나눠서 하는 문제는 문자열로 해결하는 것이 더욱 수월하고 빠르게 해결할 수 있는 방법인 듯하다 // baekjoon 1427 #include #include #include using namespace std; // codes for fast I/O void init(){ cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); } int main(){ init(); string input; cin >> input; unsigned long len = inpu..

1부터 9까지 111~999를 범위로 하여 (0 제외) 반복문을 진행하였으며, 처음에는 111~999 를 가진 배열을 통해 후보가 아닌 숫자를 제거하여 시도 하였다 하지만 과도한 반복문 사용으로 시간 초과가 우려되었다 또한 스트라이크와 볼에 대한 접근이 어려워 다른 방법을 참고하였다 처음에는 문제 자체를 이해하기 어려웠다 맞히는 사람의 입장에서만 생각해서 하다보니 너무 어렵게 접근했는데 숫자 야구 문제를 내는 사람에서 생각하면 조금 더 쉽게 접근할 수 있는 문제였다 아래는 기존에 배열로 접근했던 코드이다 9 x 9 x 9 의 경우에서 가능하지 않은 경우를 모두 제거하려고 했다 처음 시도 int n; cin >> n; int arr[729]; // 가능한 모든 수 int index = 0; for(int ..

이분 탐색을 사용하는 문제로, 기존의 나무 자르기 문제와 비슷한 유형이다 최대 길이를 가진 랜선을 구한 후, 최대 길이의 랜선의 길이에서 이진 탐색을 수행한다 랜선들을 자른 몫을 합 한 후, 몫이 입력 값 이상이 나타나는 최대 길이를 구할 수 있다. 처음에는 최대 길이를 구하기 때문에 long long cut 변수를 사용하지 않고 바로 int mid를 출력했지만 오류가 나타났다 아래 사이트에서 별도로 새로운 변수를 사용하여 출력하는 것을 참고하였다 [C/C++] 백준 1654번 - 랜선 자르기 :: 코딩 공부 일지 (tistory.com) [C/C++] 백준 1654번 - 랜선 자르기 문제 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하..

[백준] 2108번: 통계학 (C++) 1트 (tistory.com) [백준] 2108번: 통계학 (C++) 1트 숫자를 입력 받아 산술 평균 중앙값 두 번째 최빈값 범위 4가지 통계 값을 구하는 문제이다 산술 평균은 반올림을 고려하여 진행하면 된다 중앙값 과 범위는 인덱스를 활용한다 최빈값은 기존에 priceless-hyun.tistory.com 최빈값 문제를 해결하기 못해 해결하지 못했던 문제 최빈값을 구하는 과정에서 새롭게 생각해야 할 부분이 있었다 새로운 해결법을 찾기 위해 찾아보던 중 다른 사이트에서는 최대 입력 값이 4000인 것을 고려하여 8000 크기를 가진 배열을 사용하였는데 그 부분이 이해가 가지 않아 다른 풀이를 찾던 중 아래의 사이트를 참고하였다 백준 2108 통계학 c++ [컴공과..

숫자를 입력 받아 산술 평균 중앙값 두 번째 최빈값 범위 4가지 통계 값을 구하는 문제이다 산술 평균은 반올림을 고려하여 진행하면 된다 중앙값 과 범위는 인덱스를 활용한다 최빈값은 기존에 알고 있는 정보로는 부족했다 두 번째 최빈값을 구하기 위해 첫 번째 최빈값과 두 번째 최빈값을 저장하는 방식으로 접근 했으나 쉽지 않았다 아래 방법과 같이 구현했지만 최빈값 갱신 과정에서 문제가 발생한 것인가 오답이 나타났다 두 최빈 값을 인덱스 값도 추가하여 구현했지만 별다른 방법이 나타나지 않았다 int count = 1; int first_max_same = 1; int second_max_same = 0; int temp = 0; //int index = 0; for(int i = 0; i < n; i++){ m..

https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net 상진형의 도움을 많이 받은 문제 우선 생성자라는 개념을 이해해야 한다 각 자리의 숫자를 합하고 원래 숫자를 합해서 나온 수의 원래 숫자를 나온 수의 생성자라고 한다 예를 들어 245는 245+2+4+5=256 이므로 256의 생성자는 245이다. 해당하는 숫자의 가장 작은 생성자를 찾아서 하므로 1부터 생성자를 찾을 때까지 브루트포스 알고리즘을 사용해야 한다 i는 생성..