문제

길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다.

두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다.

  1. A의 앞에 아무 알파벳이나 추가한다.
  2. A의 뒤에 아무 알파벳이나 추가한다.

이때, A와 B의 길이가 같으면서, A와 B의 차이를 최소로 하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 주어진다. A와 B의 길이는 최대 50이고, A의 길이는 B의 길이보다 작거나 같고, 알파벳 소문자로만 이루어져 있다.

출력

A와 B의 길이가 같으면서, A와 B의 차이를 최소가 되도록 했을 때, 그 차이를 출력하시오.

풀이

#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;


int main() {
	
	string a, b; 
	int cnt = 0;
	int temp = 987654321;
	cin >> a >> b;
	for (int j = 0; j < b.length() - a.length() + 1; j++) {
		for (int i = 0; i < a.length(); i++) { //a는 0부터 a.length()-1까지 고정
			if (a[i] != b[i+j]) // b만 증가시켜가며 비교
			{
				cnt++;
			}
		}
		temp = min(cnt, temp);
		cnt = 0;
	}

	printf("%d", temp);

	return 0;
}

 

 풀다보니 C와 C++의 혼종이 되어버림;

'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

문제

백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다.

그런데 올해에는 대회에 참여하려는 학생들 중 K명을 반드시 인턴쉽 프로그램에 참여하라는 학교의 방침이 생기게 되었다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.

여러분은 N명의 여학생과 M명의 남학생, K명의 인턴쉽에 참여해야하는 인원이 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.

입력

첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100), (0 ≤ N ≤ 100), (0 ≤ K ≤ M+N),

출력

만들 수 있는 팀의 최댓값을 출력하면 된다.

풀이

#include <stdio.h>

int main() {

	int n, m, k;
	int teamCount;
	int etc;

	scanf("%d %d %d", &n, &m, &k);
	//3팀 - 3부터 1팀 -14 = -5팀으로 계산 그러면 일단 여학생과 남학생으로 팀 개수 구하고, k로 팀 개수를 뺀다.
	if ((n / 2) > m) {
		teamCount = m;
	}
	else {
		teamCount = n/2;
	}
	// 팀개수 일단 구했음 이제 필요없는 애들수랑 K 비교 
	// 필애수>K = 팀개수그대로 반대일경우 팀개수 감소하겠지 -1~-3은 1 -4~-6은 2 이런식
	// 15 13 6 했을때 현재 teamCount = 7 필요없는 애들수= n + m - teamCount*3 
	
	//필요없는 애들 수

	etc = n + m - (teamCount * 3);
	if (etc >= k) {
		printf("%d", teamCount);
	}
	else { 
		if ((k - etc) % 3 == 0)
		{
			teamCount = teamCount - ((k - etc) / 3); // 0으로 나누어질때는 -1 하면 안됨
		}
		else
		{
			teamCount = teamCount - ((k - etc) / 3) - 1;
		}
		if (teamCount == -1)
		{
			printf("%d", 0);
		}
		else
		{
			printf("%d", teamCount);
		}

	}

	return 0;
}

'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 105개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

풀이

#include <stdio.h>

int i, sum, cnt[10];
char str[100002];

int main() {
	scanf("%s", str);

	for (i = 0; str[i]; i++) // 문자열 끝까지( 널까지 ) 실행
		cnt[str[i] - '0']++, sum += str[i] - '0'; // str[i] - '0' -> 문자를 숫자로 바꿔줌
	
	if (!cnt[0] || sum % 3) {
		printf("-1");
	}
	
	else
	{
		for (i = 9; i >= 0; i--)
			while (cnt[i]--) {  // cnt[i]가 0이되면 while문 멈춤. 그래서 반복이 안됨.
				printf("%d", i);
			}
	}

	return 0;
}

 

'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

동전 0 성공

 

문제

준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.

동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

출력

첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.

예제 입력 1 복사

10 4200 1 5 10 50 100 500 1000 5000 10000 50000

예제 출력 1 복사

6

 

접근방법

예제에서 4200원을 동전으로 나눌때 4200보다 큰 숫자로 나누면 몫이 0이다.

그래서 몫이 0이 아닌 숫자가 나타났을때 나누도록 해서 코드를 짰다.

 

소스

#include  <stdio.h>
.
int main()
{
int n, k, coin[10];
int cnt = 0;
scanf("%d %d", &n, &k);

for (int i = 0; i < n; i++)
{
    scanf("%d", &coin[i]);
}

for (int i = 0; i < n; i++)
{
    if (k / coin[n-1-i] != 0)
        {
            cnt = cnt + (k / coin[n - 1 - i]);
            k = k % coin[n-1-i];
        }
}
printf("%d", cnt);

return 0;
}


'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 15999 (카카오 코드 페스티벌 2018-C)  (0) 2019.06.25

BOJ 15999 (카카오 코드 페스티벌 2018-C)


어느 날, 네오는 길을 걷다가 격자판 하나를 주웠다. 그 격자판은 행 열로, 각 격자는 흰색 또는 검은색으로 칠해져 있다.

네오는 이 격자판에는 분명 엄청난 비밀이 숨겨져 있을 것이라고 생각해 나중에 해독을 시도해 보기로 하였다. 아래 그림은 격자판 상태의 예시이다.


네오가 잠시 외출한 사이, 프로도는 네오의 격자판을 이리저리 살펴보았다. 얼마 뒤, 하나의 격자를 누르게 되면 자신을 포함해 그 격자와 연결된 모든 칸들의 색이 반전된다는 사실을 관찰할 수 있었다. 여기서, 두 격자가 연결되었다는 것은 두 격자 사이를 서로 같은 색이면서 변을 공유하는 격자들로만 이동하여 오갈 수 있다는 것을 뜻한다. 집으로 돌아온 네오는 프로도가 격자판의 상태를 바꿔버렸다는 것을 알고 좌절했다. 하지만 최종 상태를 알고 있기 때문에, 초기 상태를 추측할 수 있을 것이라는 희망을 가지기로 했다.

프로도는 격자판을 0번 이상 눌렀다(아직 한 번도 누르지 않은 상태일 수도 있다). 현재 각 격자의 색깔이 주어졌을 때, 격자판의 초기 상태로 가능한 경우의 수를 1,000,000,007(109 + 7)로 나눈 나머지를 구하여라. 두 격자판의 상태가 다르다는 것은, 같은 위치의 격자의 색이 다른 경우가 존재할 때로 정의한다.

입력

첫 줄에 격자판의 행의 수 과 열의 수 이 주어진다. (1 ≤ NM ≤ 2,000)

둘째 줄부터 개의 줄에 걸쳐 현재 각 격자의 색을 나타내는 문자열이 주어진다.

개의 줄 중에서 번째 줄의 번째 문자는 행 열 격자의 색을 나타내며, 'B'인 경우 검은색, 'W'인 경우 흰색임을 나타낸다.

출력

첫 줄에 격자의 초기 상태로 가능한 경우의 수를 1,000,000,007(109 + 7)로 나눈 나머지를 출력한다.

예제 입력 1 

2 2
WB
BB

예제 출력 1 

2

WB
BB

WB
BW

이렇게 두 가지가 가능하다.


문제 분석

일단 문제에서 하나의 격자를 누르게 되면 자신을 포함해 그 격자와 연결된 모든 칸들의 색이 반전된다.

그런데 여기서 연결되어있다는 것은 같은 색 타일이 변으로 연결되어 있다는 것을 의미한다.

위 예제에서 WB 

                    BB  는 B 세칸이 서로 연결되어있어서 아무 B 타일을 누르면 B 타일이 모두 반전된다.

예제에서 왜 WB  WB 가 초기상태로 가능하냐면 WB 을 제외한 다른 상태에서는 WB 모양을 만들 수가 없기 때문이다.

                    BB   BW                                              BW                                             BB

그래서 인접한 타일이 모두 같은 색깔인 타일로만 이루어진 타일의 개수를 구해 그 개수만큼 2를 제곱하면 된다. ex) 10개일 경우 2의 10승


코드

#include <stdio.h>

#define MOD 1000000007


int pow(int x) {  // 2의 x승 구하는 함수

if (x == 0) return 1; 

if (x == 1) return 2;


long long value = calcPow(x / 2);

if (x % 2 == 0) {

return (value * value) % MOD; // 2^2x = 2^x * 2^x

}

else {

return (((value * value) % MOD) * 2) % MOD; // 2^(2x + 1) = 2^x * 2^x * 2

}

}

int main()

{

int n, m;

char block[2001][2001];

int cnt=0;

int sum;


scanf("%d %d", &n, &m);


for (int i = 0; i < n; i++)

{

scanf("%s", block[i]);

}


for (int i = 0; i < n; i++)

{

for (int j = 0; j < m; j++)

{

if ((i == 0 || block[i - 1][j] == block[i][j]) && (i == n - 1 || block[i + 1][j] == block[i][j]) && (j == 0 || block[i][j - 1] == block[i][j]) && (j == m - 1 || block[i][j + 1] == block[i][j])) {

cnt++; // 인접한 타일이 모두 같은 색깔로 둘러싸인 타일 개수 구하기

}

}

}

printf("%d", pow(cnt));


return 0;

}




'알고리즘 코딩' 카테고리의 다른 글

[BOJ C/C++] 1120 문자열  (0) 2019.09.29
[BOJ C/C++] 2875 대회 or 인턴  (0) 2019.09.28
[BOJ C/C++] 10610 30  (0) 2019.09.28
[BOJ C/C++] 11047 동전 0  (0) 2019.06.27

+ Recent posts