Training/BOJ 16

[C++] 1193 분수찾기

편의상 각각의 주황색 화살표를 '행'이라 칭하겠음. int c와 total은 x번째 분수를 구하기 위해 총 몇 개의 행을 지나야 하는지 세기 위해, order는 x번째 분수가 마지막 행의 몇 번째 순서의 값인지 파악하기 위한 변수이다. total 값이 x 값보다 크거나 같아질 때까지 1, 2, 3, ... 차례대로 더해준다. order는 x가 속한 행의 직전 행까지의 c의 합을 빼준 값을 x 에서 빼서 구해준다. ex) x가 14면 c==5, total==15 에서 break. order는 14-(15-5) = 4가 된다. 즉 구하려는 분수가 마지막 행의 4번째 값이라는 뜻. 그 후 행이 홀수행인지 짝수행인지에 따라서 분수를 출력하는 규칙을 달리 정해준다. #include using namespace s..

Training/BOJ 2021.03.09

[C++] 10996 별 찍기 - 21

규칙은 N개로 이루어진 일정의 패턴을 N번 반복한다는 것이다. 그래서 출력되는 총 별의 갯수는 N*N개다. 패턴은 N이 짝수일 때와 홀수일 때, 두 가지로 나눠지는데 짝수일 때는 첫번째 줄에 N/2개, 그 다음 줄에 한 칸 띄고 N/2개를 출력하는 게 한 세트이다. 이 세트를 똑같이 N번 반복해서 출력한다. 홀수일 때에는 첫째 줄에 N/2+1개, 그 다음 줄에 한 칸 띄고 N/2개를 출력하는 게 한 세트. 홀수도 마찬가지로 세트를 N번 반복 출력한다. #include using namespace std; void PrintStars(int N) { if (N % 2 == 1) { for (int i = 0; i < N; i++) { for (int stars1 = 0; stars1 < N / 2 + 1;..

Training/BOJ 2020.08.10

[C++] 2446 별 찍기 - 9

아무리 봐도 맞았는데 자꾸 출력 형식이 잘못되었다고 하길래 검색해봤다. 나와 같은 문제를 겪은 사람이 있었다. omg ㅋㅋ... 아무튼 출력형식 말고도 애초에 코드 짜면서 좀 애먹었던 문제. ********* ******* ***** *** * *** ***** ******* ********* N*N 크기의 정사각형이 있다고 가정. 각 줄마다 조건에 맞게 앞뒤로 *을 뺀 만큼 그 자리를 공백으로 채워주는 방식으로 처리했다. 물론 뒤쪽에도 열심히 공백을 채워줘서 결국 문제가 발생했지만. 아무튼 조건에 맞게 앞쪽에만 공백 채우고, 별 출력해주면 끝. 별 하나만 찍히는 중간지점을 기준으로 두 영역으로 나눠서 계산했다. #include using namespace std; int main() { int N; c..

Training/BOJ 2020.08.10

[C++] 10809 알파벳 찾기

코드 짤 때부터 이렇게 하는게 맞나 싶어서 제출 한 다음에 다른 사람들이 쓴 코드를 찾아봤는데 역시 쉬운 방법이 있었다. STL 함수는 많이 써보고 많이 외워두자. 처음에 제출한 코드 #include #include using namespace std; void Location(string x) { int* loc = new int[26]; for (int i = 0; i < 26; i++) loc[i] = -1; for (int j = 0; j < x.length(); j++) { char ch = x[j]; //cout S; int* loc = new int[26]; for (int i = 0; i < 26; i++) loc[i] = -1; int c = 97; for (int j = 0; j < 2..

Training/BOJ 2020.08.10

[C++] 2869 달팽이는 올라가고 싶다

먼저 가장 확실한 것부터 처리하고 시작한다. 정상에 올라가기 전까지, 하루에 A-B 만큼 꾸준히 올라가는 그 시기를 먼저 계산한다. (V-A)/(A-B) 를 계산한 몫이 하루동안 A-B 만큼 올라간 기간의 일수다. days = (V - A) / (A - B) 라고 한다면, 이제 남은 거리는 V - days * (A - B) 만큼이 될 것이다. left_distance = V - days * (A - B) 라고 하자. 여기서 두 가지의 경우로 나뉜다. 한 가지는 남은 거리가 A보다 작거나 같은 경우, 두번째는 남은 거리가 A보다 큰 경우. 첫번째 경우는 자명하게도 days 에서 하루만 더 추가해주면 된다. (정상에 오른 후에는 미끄러지는 경우를 고려하지 않으므로) 두번째 경우, 남은 거리는 A보다 크지만 ..

Training/BOJ 2020.08.08

[C++] 8958 OX퀴즈

string 배열 quiz 에 N개의 퀴즈 결과를 입력받고 저장한다. int 배열 score 도 생성해서, 각 퀴즈 결과의 총점을 계산 후 저장한다. 퀴즈 결과의 각 문제마다, O라면 countO 값 1 증가, X라면 countO = 0 으로 초기화. 다음 문제로 넘어가기 전에 매번 countO 값을 score 배열의 해당되는 원소에 더해준다. 마지막 문제까지 이 과정을 반복한다. 모든 퀴즈 결과에 대해서 위의 과정을 반복한다. score 배열을 출력한다. #include #include using namespace std; void Score(string* quiz, int N) { int* score = new int[N]; for (int i = 0; i < N; i++) score[i] = 0; ..

Training/BOJ 2020.08.03

[C++] 3052 나머지

배열 in_arr 에 숫자 10개를 차례대로 입력받고 저장한다. 배열 re_arr 에 in_arr 의 원소들을 각각 42로 나눈 나머지를 차례대로 저장한다. re_arr 를 오름차순으로 sort 한다. check 라는 변수를 만들고, re_arr의 첫번째 원소를 할당해준다. re_arr 의 두번째 원소부터 차례대로 check 와 같은 값을 가지는지 아닌지 확인을 해본다. 같은 값이 아니라면 cases 값을 하나 증가시켜 준 뒤, check 값은 비교결과가 같지 않았던 그 re_arr의 원소 값으로 다시 할당해준다. 앞의 과정을 re_arr 의 모든 원소에 대해서 반복한다. 비교가 끝났다면 cases 값을 출력한다. #include #include using namespace std; int main() ..

Training/BOJ 2020.08.03

[C++] 2577 숫자의 개수

0~9개가 각각 몇 개인지 저장할 배열 count를 만든다. (배열값들 0으로 초기화) int A,B,C를 입력받고 long mult 변수에 곱셈결과를 저장한다. 이제 mult>0 를 만족하는 동안, mult%10 을 구한 뒤 mult 를 10으로 나눠주는 과정을 반복한다. mult%10 이 0~9 중 무엇인지 switch문을 통해서 판단 후 배열의 해당되는 원소 값을 증가시켜준다. ex) mult%10 == 1 이면 count[1]++, mult%10 == 5 면 count[5]++. mult/=10 후 앞의 과정 반복. mult 가 다 나눠지고 0이 되면 count 배열의 원소들을 차례대로 출력한다. #include using namespace std; int main() { int A = 0, B ..

Training/BOJ 2020.08.03

[C++] 2562 최댓값

서로 다른 100보다 작은 자연수 9개를 in_arr 배열에 입력받는다. in_arr 배열의 원소들을 sort_arr로 복사한다. sort_arr를 algorithm의 sort 함수를 이용해서 정렬한다. 그럼 sort_arr의 맨 마지막 원소가 최댓값이다. 이 최댓값과 in_arr의 원소들을 차례대로 비교하면서, 매치되는 원소의 in_arr 내에서의 위치를 저장한다. 최댓값과 위치값을 출력한다. #include #include using namespace std; int main() { int* in_arr = new int[9]; int* sort_arr = new int[9]; int max = 0, loc = 0; for (int i = 0; i > in_arr[i]; f..

Training/BOJ 2020.08.03

[C++] 11720 숫자의 합

처음에 이걸 어떻게 풀지 고민할 때, '입력을 string으로 받은 다음에 stoi 함수를 이용해서 int로 바꾸고, 계속 10으로 나눈 나머지를 더한 결과를 출력하면 되겠네!' 라고 생각했다. ​ 그대로 구현하다 보니 미처 고려 못 한 부분이 있었다. 둘째 줄에 입력받을 숫자는 1개 이상 100개 이하다. 즉, 최대 100개의 자릿수를 가진 매우 큰 숫자가 입력될 수도 있다. 그런 큰 숫자는 int형으로 변환될 수 없다. int형이 표현할 수 있는 가장 큰 수는 2,147,438,647 밖에 안 되기 때문. ​ 그렇다면 int 보다 더 큰 자료형인 long long으로 변환하면 해결될까? 그것 또한 아니다. long long이 제 아무리 int 보다 두 배의 메모리 공간을 가지고 수용할 수 있는 범위가..

Training/BOJ 2020.07.20

[C++] 15552 빠른 A+B

cin / cout 을 사용하고자 한다면 sync_with_stdio(false); cin.tie(NULL); 를 둘 다 적용하라고 한다. 그리고 endl 대신 개행문자를 써야한다. ​ 문제의 요지는 '시간을 최대한 줄여라.' 이다. #include using namespace std; int main() { cin.tie(NULL); ios::sync_with_stdio(false); int T; cin >> T; int a, b = 0; int *result = new int[T]; for (int i = 0; i > a >> b; result[i] = a + b; } for (int i = 0; i < T; i++) { cout

Training/BOJ 2020.07.20

[C++] 2839 설탕 배달

나누기, 나머지 연산을 이용하는 문제 ​ 머리가 굳어버려 쩔쩔매던 중에 힌트 발견해서 단번에 성공. (감이 안 잡힐 때에는 저 힌트를 보자.) ​ 문제는 설탕 N kg을 배달하는데, 봉지의 갯수를 최소한으로 해야한다는 것. 결국 5kg 짜리 봉지를 가능한 한 많이 끼워넣고 시작해야한다. ​ 그럼 먼저, N(3 이상)을 5로 나눈 나머지를 구해보자. 3, 4, 0, 1, 2 가 반복된다. 그렇다는 얘기는 N%5의 결과에 따라 경우가 나뉜다는 뜻. 경우에 따라 구분하여, 각각의 규칙을 찾아본다. ​ if (N%5 == 3): 5로 나눴을 때의 나머지가 3인 숫자는 3, 8, 13, 18, 23, ... 3을 제외하고 8부터는 5x + 3의 꼴이다. ​ if (N%5 == 4): 4, 9, 14, 19, 24..

Training/BOJ 2020.07.18

[C++] 1008번 A/B

성공할 때 까지 무려 7번이나 틀린 문제. 별거 아니라고 얕봤다가... ㄷㄷ ​ 문제는 cout.precision() 이었다. 이게 무엇인지, 문제가 무엇을 요구하는지 잘못 이해한 채로 무작정 화만 내면서 제출하니까 안 됐던 것. ​ 문제의 출력 조건은 절대/상대 오차는 10^-9 까지 허용한다. 난 이걸보고 무작정 cout.precision(9); 을 쓰고 앉아있었다. 이건 문제를 잘못 이해한거다. ​ 오차를 10^-9 까지 허용한다라고 함은, 소수점 아래 9번째 자리까지는 무조건 출력해야함. 10번째 자리부터는 오차로 인식. ​ 그럼 cout.precision(int)는 무엇인가? std library 안의 ios_base Class 에 속한 함수다. (여기서 ios 란 그 사과사의 운영체제가 아닌 ..

Training/BOJ 2020.07.18
반응형