전체 글 292

[백준 BOJ] 4673 셀프 넘버

링크 https://www.acmicpc.net/problem/4673 4673번: 셀프 넘버 문제 셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 www.acmicpc.net 풀이 10,000보다 작거나 같은 셀프 넘버를 출력하는 문제입니다. 숫자가 작기 때문에 셀프 넘버가 아닌 숫자를 지우는 방식을 사용하..

PS/BOJ 2020.03.01

[백준 BOJ] 1065 한수

링크 https://www.acmicpc.net/problem/1065 풀이 N이 1,000보다 작거나 같은 자연수이기 때문에 1,2,3자리수만 고려하면 됩니다. 1,000은 한수가 아니기 때문이죠. 여기서 1자리수 2자리수는 모두 한수이기 때문에 3자리수만 고려하면 됩니다. N이 1자리수거나 2자리수라면 N을 그대로 출력합니다. (모두 한수) 그게 아니라면 미리 cnt를 99로 초기값을 주고, 3자리수 중 한수가 얼마나 있는지 카운트해주면 됩니다. 123

PS/BOJ 2020.02.29

[백준 BOJ] 3047 ABC

링크 https://www.acmicpc.net/problem/3047 풀이 A < B < C 라는 대소관계를 정해놓고 입력 받은 세 수를 A, B, C의 순서에 맞게 출력하는 문제입니다. 예제를 보면 ABC이기 때문에 1 3 5의 순서로 출력된 것을 볼 수 있습니다. 저는 정렬을 사용해서 문제를 해결했습니다. 배열에 미리 정렬을 해두고 getchar()를 통해서 입력받은 문자에서 'A'를 빼서 각각 대응하는 숫자를 출력하게끔 했습니다. 코드 //3047_ABC #include #include using namespace std; int arr['D']; int main() { scanf("%d %d %d\n", &arr[0], &arr[1], &arr[2]);//입력 받음 sort(arr, arr + ..

PS/BOJ 2019.08.13

[백준 BOJ] 5585 거스름돈

링크 https://www.acmicpc.net/problem/5585 풀이 큰 액수부터 지불할 수 있는지 검사하면서 count 해주시면 됩니다. 코드 //5585_거스름돈 #include int n, cnt, i, arr[6] = {500,100,50,10,5,1}; int main() { scanf("%d", &n); n = 1000 - n;//거슬러야 하는 돈 while (n) { if (n - arr[i] >= 0) { //arr[i]로 거스를 수 있으면 n -= arr[i]; cnt++; } else //못 거스르면 i++;//다음 단계 (더 작은 액수) } printf("%d\n", cnt); return 0; }

PS/BOJ 2019.08.13

[백준 BOJ] 11399 ATM

링크 https://www.acmicpc.net/problem/11399 풀이 보시면 한 ATM 밖에 이용하지 못하는 상황입니다. 각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 찾는 문제입니다. 각 사람이 돈을 인출하는데 걸리는 시간이 주어지기 때문에 일찍 돈을 인출할 수 있는 사람을 앞으로 보내주면 됩니다. 배열에 인출 시간을 받고 정렬을 한 다음 이중 반복문으로 답을 구하면 됩니다. 코드 //11399_ATM #include #include using namespace std; int n, sum, arr[1001]; int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) scanf("%d", &arr[i]); sort(arr, arr+n); ..

PS/BOJ 2019.08.13

[백준 BOJ] 16433 주디와 당근농장

링크 https://www.acmicpc.net/problem/16433 풀이 한 위치에 당근이 심어져 있고, 당근이 심겨 있는 땅의 변을 공유하는 칸들에는 당근을 심을 수 없습니다. 이때 최대한 많은 당근을 심었을 때 밭의 모양을 출력하는 문제입니다. $N*N$의 격자입니다. $N$이 짝수일 때는 사진과 같이 $\frac{N*N}{2}$만큼 당근을 심을 수 있습니다. 그렇다면 홀수일 때는 어떨까요? 네! (1,1)칸에 당근을 심는지 아닌지에 따라 +1, -1의 차이가 있긴 하지만 당근을 심는 위치는 짝수와 비슷합니다. 이로써 $N$이 짝수든 홀수든 중요한 건 처음 당근을 심는 위치가 되겠네요! 저렇게 교차하듯이 당근을 심어야하기 때문에 xor을 사용해서 처음 당근이 (홀,홀)이나 (짝,짝)이라면 다른 ..

PS/BOJ 2019.08.13

[백준 BOJ] 10988 팰린드롬인지 확인하기

링크 https://www.acmicpc.net/problem/10988 풀이 팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말합니다. 저는 앞에서 뒤로 이동하는 커서와 뒤에서 앞으로 이동하는 커서가 가리키고 있는 문자가 동일한지 확인했습니다. 짝수나 홀수나 둘 다 len/2 만큼 비교하면 됩니다. (홀수는 가운데 뭐가 오든지 상관 없기 때문) 또 파이썬에서는 문자열을 쉽게 다룰 수 있습니다. 밑에 코드를 보시면 인덱스 슬라이싱을 이용해서 쉽게 찾을 수 있다는 걸 볼 수 있습니다. 코드 //10988_팰린드롬인지 확인하기 #include #include using namespace std; string str; int len; int main() { getline(cin, str); len..

PS/BOJ 2019.08.13

[백준 BOJ] 5598 카이사르 암호

링크 https://www.acmicpc.net/problem/5598 풀이 카이사르 단어를 원래 단어로 고쳐 출력하는 문제입니다. 저는 ABC는 XYZ로(+23) 나머지는 -3해서 출력하는 방식을 사용했습니다. 하지만 파이썬에는 translate을 이용해서 변환 테이블을 만들 수 있더라구요. 아래 코드 보시면 간단하게 풀 수 있다는 걸 알게 됩니다. 코드 //5598_카이사르 암호 #include #include using namespace std; string str; int main() { getline(cin, str); for (int i = 0; i < str.length(); ++i) { switch (str.at(i)) { case 'A': case 'B': case 'C': cout

PS/BOJ 2019.08.12

[백준 BOJ] 2231 분해합

링크 https://www.acmicpc.net/problem/2231 풀이 가장 작은 생성자를 출력하는 문제이고 없는 경우에는 0을 출력해야 합니다. N이 1,000,000까지입니다. i를 0부터 증가시켜주면서 생성자를 찾으면 출력하고 빠져나가면 되고, 못 찾으면 0을 출력하면 됩니다. 코드 //2231_분해합 #include using namespace std; int n; int main() { scanf("%d", &n); for (int i = 0; i < n; ++i) { int gen = i, tmp = i;//N을 더하고 while (tmp) {//N의 자릿수를 더하고 gen += tmp % 10; tmp /= 10; } if (gen == n) {//맞는지 확인하고 printf("%d\n..

PS/BOJ 2019.08.12
반응형