반응형

알고리즘/백준(BOJ) 문제풀이 229

[C언어 백준 풀이][Bronze II] 1225번 : 이상한 곱셈 / 1233번 : 주사위 / 1264번 : 모음의 개수

1225번 : 이상한 곱셈 새롭게 정의된 곱셈 연산을 수행하여 출력하는 문제입니다. 수의 크기 제한이 10000자리 이하라고 하였으므로, long long int 범위를 벗어나기 때문에 문자열로 처리해주어야 합니다. 두 수가 모두 10000자리이고, 각 자릿수가 모두 9인 경우, 9 * 9 * 10000 * 10000을 계산해보면 81억으로 int 형의 범위를 벗어나기 때문에 long long int를 사용하여 작성해야 합니다. #include #include int main() { long long int n = 0; char a[10001], b[10001]; scanf("%s %s", a, b); for(int i=0; i

[C언어 백준 풀이][Bronze II] 1152번 : 단어의 개수 (문자열 정규표현식) / 1159번 : 농구 경기 / 1173번 : 운동 (그리디 알고리즘)

1152번 : 단어의 개수 긴 문자열이 주어졌을 때 단어의 수를 count하여 출력하는 간단한 문제입니다. 이 문제에서 예외적으로 나올 수 있는 조건은, 문자열의 맨 앞과 뒤에 공백이 추가되어 있을 수 있다는 것입니다. (단어와 단어 중간에 공백이 여러 번 나오는 경우는 없음) #include #include int main() { int n = 1; char str[1000001]; scanf("%[^\n]s", str); for(int i=0; i

[C언어 백준 풀이][Bronze II] 1075번 : 나누기 / 1076번 : 저항 / 1100번 : 하얀 칸

1075번 : 나누기 정수 N의 가장 낮은 두 자리(십의 자리와 일의 자리)를 바꿔서 N을 F로 나누어떨어지게 하는 가장 작은 두 자릿수를 출력하는 문제입니다. 예를 들어 1000과 5를 입력받으면 뒤의 두 자릿수가 00일 때 가장 먼저 나누어 떨어지므로 답으로 00을 출력해야 합니다. F가 두 자릿수로 제한되어 있으므로 답이 없는 경우는 존재하지 않음을 알 수 있으며, 문제 조건에서도 답이 없는 경우는 다루지 않았습니다. #include int main() { int N, F; scanf("%d %d", &N, &F); N /= 100; N *= 100; for(int i=0; i

[C언어 백준 풀이][Bronze III] 유클리드 호제법 응용, 큰 수 나누기 (백준 1837번 : 암호 제작)

문제 1837번: 암호제작 원룡이는 한 컴퓨터 보안 회사에서 일을 하고 있다. 그러던 도중, 원룡이는 YESWOA.COM 으로부터 홈페이지 유저들의 비밀키를 만들라는 지시를 받았다. 원룡이는 비밀 키를 다음과 같은 방법으로 www.acmicpc.net 백준 1837번 : 암호 제작 문제를 풀이해봅시다. 이번 문제에서 필요한 기술과 개념은 long long int를 벗어나는 큰 수 다루기, 유클리드 호제법입니다. 링크는 위에 첨부되어 있습니다. 어떤 자연수와 특정 K값에 대해, 이 자연수가 K보다 작은 소수로 나누어떨어지지 않는지 확인하는 문제입니다. 입력 / 출력 / 예제 입력 범위가 정수 크기 이내라면 일일이 반복문을 돌려 확인해보면 되겠지만, 이 문제에서는 자연수 P가 10^100 이하인 long l..

[C언어 백준 풀이][Bronze III] 부재중 전화, 공, 꼬리를 무는 숫자 나열, 생장점, 문어 숫자

이번 포스트에서도 역시 Bronze III 난이도의 문제 길이가 짧지 않은 것과 문제와 풀이에 대한 부연 설명이 추가적으로 필요한 관계로 5문제만 풀이하도록 하겠습니다. 1333번 : 부재중 전화 일단 입력 범위가 1000 이하이기 때문에 반복문을 돌려서 풀이가 가능한 문제입니다. 노래 길이 L초에 5초간 노래가 정지되는 패턴이 반복되므로 시간을 L+5로 나눈 나머지를 이용하면 됩니다. 마찬가지로 전화벨은 D초에 한 번 울리며 패턴이 D초마다 반복되므로 시간을 D로 나눈 나머지를 이용하면 됩니다. #include int main() { int N, L, D, song, bell; scanf("%d %d %d", &N, &L, &D); for(int i=0; i

[C언어 백준 풀이][Bronze III] 진수 변환, 정수를 문자열로 처리하여 푸는 문제 등

백준 Bronze III 난이도의 문제들부터는 문제가 긴 경우도 있고 코드나 부연설명도 길어지는 경우가 많아 이번 포스트에서는 1009번 : 분산 처리, 1085번 : 직사각형에서 탈출, 1212번 : 8진수 2진수, 1267번 : 핸드폰 요금, 1284번 : 집 주소의 5문제를 풀이하도록 하겠습니다. 1009번 : 분산 처리 위의 문제를 간단하게 요약하면, input이 7 100인 경우 7^100을 했을 때 일의 자리가 무엇인지 구하는 것입니다. 이것은 컴퓨터가 10대이므로 결국 10으로 나눈 나머지가 마지막 데이터 처리 컴퓨터의 번호가 되기 때문입니다. 따라서 가장 단순한 방법으로는 거듭제곱을 한 뒤 일의 자리를 구하는 방법을 생각할 수 있습니다. 그러나 이 방법은 해결이 불가능할 것으로 보이는 것이..

[C언어 백준 풀이][Bronze IV] 조건문 활용, 시간 덧셈 구현, swap 함수 구현

1008번 : A/B 두 수를 나눈 몫을 소숫점 아래 9자리까지 정확하게 출력하는 문제입니다. 출력 양식을 %.9lf으로 조절해주면 되며 뒷자리가 0이어도 출력해도 되므로 다른 조작을 할 필요가 없습니다. #include int main() { double a, b; scanf("%lf %lf", &a, &b); printf("%.9lf", a/b); } 1297번 : TV 크기 대각선 길이에 cos, sin 값을 곱해주면 가로, 세로 길이를 얻을 수 있음을 알 수 있습니다. 문제 조건에서 소숫점이 나오면 그보다 작은 정수를 출력하면 된다고 하였으므로 int 형으로 출력해주면 됩니다. #include #include int main() { float d, h, w; scanf("%f %f %f", &d,..

[C언어 백준 풀이][Bronze V] 사칙 연산 10문제 : 곱셈, 나머지, 평균값 응용

1000번 : A+B 두 정수를 더한 값을 출력하는 문제입니다. #include int main() { int a, b; scanf("%d %d", &a, &b); printf("%d", a+b); } 1001번 : A-B 두 정수의 차이값을 출력하는 문제입니다. 이 때 앞에 입력된 정수에서 뒤에 입력된 정수를 빼야 합니다. #include int main() { int a, b; scanf("%d %d", &a, &b); printf("%d", a-b); } 1271번 : 엄청난 부자2 10^1000 이하의 범위에서 정수의 나눗셈에 대한 몫과 나머지를 출력하는 문제인데, C언어로는 이러한 Bronze V의 난이도가 나올 수 없습니다. (나눗셈을 직접 구현해야 함) + 찾아보니 C언어가 아닌 python..

[C언어] 자연수 분할 : 2진수 응용 (백준 9095번 : 1, 2, 3 더하기 풀이)

문제 ↓ 문제 원문 링크는 아래와 같습니다. 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 분석 자연수를 분할하는 경우의 수를 묻는 문제입니다. 다른 일반적인 자연수 분할 문제와 다른 특징은 자연수의 분할 순서를 고려하지 않으며, 4 이상의 자연수를 포함하는 분할은 제외한다는 것입니다. 일반적인 자연수 분할 문제라면 수학적으로 계산해서 공식만 구해서 풀기 쉬울테지만, 그렇지 않은 경우이므로 공식을 유도하기 쉽지 않습니다. (숏코딩 순위권 분들의 코드 길이를 보면 이 문제에서도 공식이 존재하기는 합니다.) 풀이 그렇다면 DP를 이용하여 해결하는 것이 일반적이겠으나, 저는 독립적인 방법으로 이진수를 활용하는 ..

반응형