#include <cstdio>
#include <string.h>
/**
* https://www.acmicpc.net/problem/1076
* BOJ 백준온라인져지 1076 저항 풀이
*/
using namespace std;
int main () {
char colors[10][9] = { "black", "brown", "red", "orange", "yellow", "green", "blue", "violet", "grey", "white" };
char color[9];
long long result = 0;
scanf("%s", &color);
for (int i = 0; i < 10; i++) {
if (strcmp(color, colors[i]) == 0) {
result += 10 * i;
}
}
scanf("%s", &color);
for (int i = 0; i < 10; i++) {
if (strcmp(color, colors[i]) == 0) {
result += i;
}
}
scanf("%s", &color);
for (int i = 0; i < 10; i++) {
if (strcmp(color, colors[i]) == 0) {
for (int j = 0; j < i; j++) {
result *= 10;
}
}
}
printf("%lld", result);
}
view raw BOJ_1076.cpp hosted with ❤ by GitHub

시간 제한메모리 제한제출정답맞은 사람정답 비율
2 초128 MB71952759237639.221%

문제

전자 제품에는 저항이 들어간다. 저항은 색 3개를 이용해서 그 저항이 몇 옴인지 나타낸다.

처음 색 2개는 저항의 값이고, 마지막 색은 곱해야 하는 값이다.

저항의 값은 다음 표를 이용해서 구한다.

black01
brown110
red2100
orange31000
yellow410000
green5100000
blue61000000
violet710000000
grey8100000000
white91000000000

예를 들어, 저항에 색이 yellow, violet, red였다면 저항의 값은 4,700이 된다.

입력

첫째 줄에 첫번째 색, 둘째 줄에 두번째 색, 셋째 줄에 세번째 색이 주어진다. 색은 모두 위의 표에 써 있는 색만 주어진다.

출력

첫째 줄에 입력을 주어진 저항의 저항값을 출력한다.


#include <cstdio>
/**
* https://www.acmicpc.net/problem/2010
* BOJ 백준온라인져지 2010 플러그 풀이
*/
int main () {
long long result = 0;
int testcase = 0;
scanf("%d", &testcase);
while (testcase--) {
int temp = 0;
scanf("%d", &temp);
result += temp - 1;
}
printf("%lld", result + 1);
}
view raw BOJ_2010.cpp hosted with ❤ by GitHub

문제

선영이의 집에는 콘센트를 꽂을 수 있는 플러그가 하나밖에 없다. 선영이는 많은 컴퓨터를 가지고 있는데, 컴퓨터의 전원 문제는 어떻게 해결하는 것일까?

하나의 플러그가 있고, N개의 멀티탭이 있다. 각 멀티탭은 몇 개의 플러그로 이루어져 있다고 한다. 최대 몇 대의 컴퓨터를 전원에 연결할 수 있을까?

입력

첫째 줄에 멀티탭의 개수 N이 주어진다. (1<=N<=500,000) 이어서 둘째 줄부터 N개의 줄에 걸쳐 각 멀티탭이 몇 개의 플러그를 꽂을 수 있도록 되어 있는지를 나타내는 자연수가 주어진다. 이 자연수는 1,000을 넘지 않는다.

출력

첫째 줄에 최대로 전원에 연결될 수 있는 컴퓨터의 수를 출력한다.


1. R1/2 + R2/2 = S (기본식)

2. R1/2 - S = -R2/2 (이항)

3. R2=2S-R1 (더 간단한 식)

#include <cstdio>
/**
* https://www.acmicpc.net/problem/3046
* BOJ 백준온라인져지 3046 R2 풀이
*/
int main () {
float R1, S;
scanf("%f%f", &R1, &S);
printf("%d", (int)((R1/2-S)*-2));
}
view raw BOJ_3046.cpp hosted with ❤ by GitHub


시그마 (0 -> 9) 가 i일때, 1 / i! 들의 합을 구하는것

#include <cstdio>
/**
* https://www.acmicpc.net/problem/6376
* BOJ 백준온라인져지 6376 e 계산 풀이
*/
int main(){
printf("n e\n");
printf("- -----------\n");
printf("0 1\n");
printf("1 2\n");
printf("2 2.5\n");
double factorial = 2;
double i = 2;
double result = 2.5;
while(factorial < 9){
factorial++;
i *= factorial;
result += 1 / i;
printf("%.0f %.9f\n", factorial, result);
}
}
view raw BOJ_6376.cpp hosted with ❤ by GitHub


min ~ max에 i^2 의 배수가 몇개 있는지를 찾는다.

그리고 있으면 count에 더해준다.


if(duplicatedValue[i] == 1) continue;

이 경우는 n의 m승 이미 계산된거.

else if(duplicatedValue[i] > 1) duplicatedValue[j]--;

이 경우는 i 가 6인경우로 예를 들 수 있다.

i가 6이면 2와 3에서 증가된다.


6의 배수들을 1로 변경해주고,

count -= (max / (i * i) - (min - 1) / (i * i)) * (duplicatedValue[i] - 1);

이 코드에서 6의 배수들이 중복으로 계산됐던걸 빼준다.

#include <cstdio>
/**
* https://www.acmicpc.net/problem/1016
* BOJ 백준온라인져지 1016 제곱 ㄴㄴ 수 풀이
*/
#define MAX 1000005
using namespace std;
int main(){
long long min, max;
scanf("%lld%lld", &min, &max);
int count = -1;
int *duplicatedValue = new int[MAX];
for(long long i = 2; i * i <= max; i++){
if(duplicatedValue[i] == 1) continue;
for(long long j = i * 2; j * j <= max; j += i){
if(duplicatedValue[i] == 0) duplicatedValue[j]++;
else if(duplicatedValue[i] > 1) duplicatedValue[j]--;
}
count -= (max / (i * i) - (min - 1) / (i * i)) * (duplicatedValue[i] - 1);
}
printf("%lld", max - min - count);
}
view raw BOJ_1016.cpp hosted with ❤ by GitHub

0! = 1

팩토리얼 구하는 문제.

#include <cstdio>
/**
* https://www.acmicpc.net/problem/10872
* BOJ 백준온라인져지 10872 팩토리얼 풀이
*/
int main(){
unsigned long long result = 1;
int N;
scanf("%d", &N);
while(N--) result *= N+1;
printf("%lld", result);
}
view raw BOJ_10872.cpp hosted with ❤ by GitHub



N은 약수의 처음 주어진 숫자와 마지막 숫자를 곱해주면 나온다.



예를 들어 9가 N이면

3 이 약수로 있다.


그러면 3 * 3 = 9


20 이면

2 4 5 10

2 * 10 = 20 

#include <cstdio>
#include <vector>
/**
* https://www.acmicpc.net/problem/1037
* BOJ 백준온라인져지 1037 약수 풀이
*/
using namespace std;
vector<int> divisor;
void quickSort(int l, int r){
int i = 0, j = r;
int pivot = divisor[(l + r) / 2];
do{
while(divisor[i] < pivot) i++;
while(divisor[j] > pivot) j--;
if(i <= j){
int temp = divisor[i];
divisor[i] = divisor[j];
divisor[j] = temp;
i++, j--;
}
}while(i <= j);
if(l < j) quickSort(l, j);
if(r > i) quickSort(i, r);
}
int main(){
int N;
scanf("%d", &N);
while(N--){
int temp;
scanf("%d", &temp);
divisor.push_back(temp);
}
quickSort(0, divisor.size()-1);
printf("%ld", (long) divisor[0] * (long) divisor[divisor.size()-1]);
}
view raw BOJ_1037.cpp hosted with ❤ by GitHub


20 은 2 * 2 * 5 로 소인수 분해가 된다.

2 와 10

2 x 2 사이즈의 초콜릿은

1 x 2

1 x 2 로 나눠진다.


3 x 3 사이즈의 초콜릿은

1 x 3

2 x 3 이런식으로 나눠진다.


1 x 3 은 

2번 자를 수 있다.


코드가 더럽다.


#include <cstdio>
/**
* https://www.acmicpc.net/problem/2163
* BOJ 백준온라인져지 2163 초콜릿 자르기 풀이
*/
int cnt = 0;
void slice(int N, int M){
if(N == 1){
cnt += M - 1;
} else if(M == 1){
cnt += N - 1;
} else if(N % 2 == 0){
slice(N / 2, M);
slice(N / 2, M);
cnt++;
} else if(M % 2 == 0){
slice(N, M / 2);
slice(N, M / 2);
cnt++;
} else if(N % 2 != 0){
slice(N - 1, M);
slice(1, M);
cnt++;
} else if(M % 2 != 0){
slice(N, M - 1);
slice(N, 1);
cnt++;
}
}
int main(){
int N,M;
scanf("%d%d", &N,&M);
slice(N, M);
printf("%d", cnt);
}
view raw BOJ_2163.cpp hosted with ❤ by GitHub

예제 입력 

6 2 10 3

예제 출력 

1


이산은 연속성이 전혀 없는 분리된 상태를 말한다.


실수와 같이 연속적인 성질을 가진 값에 대해 공부하는 학문이 아니라 

정수와 같이 분리된 값에 대해 공부하는 학문이다.


컴퓨터는 0과 1의 분리된 값으로 모든 데이터를 표현하고 연산 및 처리한다.



이산수학의 필요성


컴퓨터의 설계부터 입력 처리, 결과 출력까지 모든 과정을 이해하는데 기본이 된다.

변수 선언조차 수학적 개념이 포함됐다.

'이전 글 > 2017-10-13 이전 글' 카테고리의 다른 글

하한항  (0) 2017.07.10
기수  (0) 2017.07.10
Request, Response  (0) 2017.07.10
2017-07-09  (0) 2017.07.09
함수의 재귀적 호출의 이해  (0) 2017.07.08

+ Recent posts