[구름 알고리즘 먼데이 챌린지] Week6 : 4. 경쟁 배타의 원리
문제 경쟁 배타의 원리란 생태학의 원리 중 하나로, 같은 영역에서 같은 생태적 지위를 차지하는 두 종은 분서를 제외하고는 공존할 수 없다는 것이다. 쉽게 말해서, 둘 이상의 종이 존재한다면 서로 경쟁하여 생존에 유리한 하나의 종만이 살아남는다. 하지만 구름이가 설계한 메타버스의 경쟁 배타의 원리는 이와 조금 다른데, 둘 이상의 종이 아닌 정확히 K개의 종이 공존할 때만 경쟁이 일어난다. 종의 수가 K보다 작거나 많다면 경쟁이 일어나지 않고 공생하며 살아간다. 구름이의 메타버스는 가로 세로 크기가 1,000인 정사각형 모양이다. 현재 구름이의 메타버스에는 생태적 지위가 같은 N종의 생물이 있고, 각 종의 서식지는 메타버스의 테두리에 평행한 직사각형 모양으로 나타내어진다. 메타버스의 생태계 지도가 주어졌을 ..
2022.11.14
[구름 알고리즘 먼데이 챌린지] Week6 : 3. 비밀 편지
문제 구름이는 친구에게 전달할 편지의 내용을 숨기기 위해서 새로운 암호 방법을 고안했다. 암호는 문자열과 암호/복호화를 위한 토큰으로 이루어져 있다. 토큰 앞에 붙는 E 혹은 D표시를 통해서 암호화 혹은 복호화를 진행해야 한다. 구름이가 만든 암호화 과정은 다음과 같다. ●토큰을 문자열과 같은 길이로 맞춘다. 만약에 토큰의 길이가 문자열보다 작다면, 토큰을 반복하여 늘릴 수 있다. ●문자열의 값이 알파벳 대소문자인 경우 토큰의 ASCII 코드 값만큼 shift한다. shift는 알파벳의 다음 글자로 바뀌는 연산을 의미하며 'Z' 혹은 'z'인 경우 'A' 혹은 'a'로 바뀐다. ●ASCII 코드에서 'A'~'Z'는 65~90, 'a'~'z'는 97~122이며 '0'~'9'는 48~57이다. 복호화는 암호..
2022.11.14
[구름 알고리즘 먼데이 챌린지] Week6 : 2. 제곱암호
문제 구름이는 비밀스러운 이야기를 전달하기 위해서 새로운 암호 체계인 제곱암호를 고안했다. 제곱암호로 암호화된 문장은 다음과 같은 특징을 가진다. ●암호문의 길이가 N이라면, N/2개의 숫자와 N/2개의 알파벳 소문자로 이루어져 있다. 암호문의 길이는 항상 짝수이다. ●암호문의 첫 글자는 항상 알파벳 소문자이며, 이후에는 항상 숫자와 알파벳 소문자가 번갈아 가며 등장한다. 제곱암호로 암호화된 문장은 아래 방식을 통해 복호화할 수 있다. ●원문은 N/2의 길이를 가지고 있으며, 모두 알파벳 소문자이다. ●암호문의 첫 번째 문자부터 순서대로 아래의 복호화 과정을 거친다. 첫 번째 문자는 문장의 가장 왼쪽 문자를 의미한다. ●i가 홀수일 때, 암호문의 i번째 문자를 알파벳의 사전 기준 다음 문자로 바꾸는 작업..
2022.11.14
no image
[구름 알고리즘 먼데이 챌린지] Week6 : 1. 7게임
입력받은 문자열을 문제 조건에 맞게 처리해 주어 간단하게 해결할 수 있었다. 1.입력 받은 7자리 정수 K의 홀수 번째 숫자들을 합한 a를 생성 2.a에 K의 0이 아닌 짝수 번째 숫자들을 곱하기 3.a(mod10) 출력 #include using namespace std; int a; string input; void sum_add() for (int i = 0; i < 7; i += 2) a += input[i] - '0'; } void multi_even() { for (int i = 1; i < 6; i += 2) { if (input[i] == '0') continue; a *= input[i] - '0'; } } int main() { ios::sync_with_stdio(0); cin.tie..
2022.11.14
no image
[구름 알고리즘 먼데이 챌린지] Week5 : 3. 수 이어 붙이기
완탐문제라고 생각했고 재귀호출과 백트래킹을 적절히 사용하여 가능한 경우를 모두 구해주어 최소 값을 갱신해 주도록 하였다. 한 가지 함정에 주의하자! 문제에서 겹쳐서 이어 붙일 수 있는 경우에도 그냥 이어 붙있 수 있다고 하지만 조금만 생각해 보면 최소 값을 위해서는 가능한 경우 항상 겹쳐서 이어 붙이는 것이 합리적이라는 것을 알 수 있다. #include #include #include using namespace std; int n; long long ans = 9999999999999999, num; vector numbers(9, 0), visited(9, 0); void dfs(int cnt, string number) { if (cnt == n) { num = stoll(number); if (..
2022.11.12
no image
[구름 알고리즘 먼데이 챌린지] Week5 : 2. 모래섬
문제 바닷가에 놀러 간 구름이는 모래사장에서 모래를 쌓아서 모래섬을 만들었다. 구름이는 자신이 만든 모래섬 사이에 다리를 세우고 싶어한다. 다리를 그냥 만들 수도 있지만, 구름이는 서로 떨어진 섬과 섬을 이어줄 때 다리가 의미가 있다고 생각을 했다. 그래서 구름이는 모래사장에 물을 부어서 모래섬을 여러 개의 섬으로 나누고자 한다. 모래사장은 세로의 길이가 N, 가로의 길이가 M인 직사각형 모양의 땅이다. 모래사장을 1*1 크기로 나누었을 때, 가장 왼쪽 위부터 i번째 줄의 j번째 칸의 상태를 arr[i][j]라고 표현할 수 있다. 각 칸의 상태는 0또는 1중 하나이다. ●arr[i][j]의 값이 0이라면, 그 칸은 물에 가라앉은 칸임을 의미한다. ●arr[i][j]의 값이 1이라면, 그 칸은 모래가 쌓여..
2022.11.12
no image
[구름 알고리즘 먼데이 챌린지] Week5 : 1. 개미와 진딧물
문제 한 변의 길이가 N인 정사각형 모양의 평면에 진딧물 집과 개미 집이 있다. 개미 집은 고유의 영역 범위 안의 모든 진딧물에게서 수액을 수집한다. 이 수액이 없으면, 개미 집은 부족한 식량으로 제거된다. 길이가 4인 정사각형 평면을 1*1 크기의 작은 정사각형으로 나누면 아래와 같은 그림으로 표현할 수 있다. 위와 같은 상태로 arr[i][j] 값들이 주어진다. arr[i][j]의 값은 0, 1, 2 중 하나이며, 1 은 개미 집이고, 2는 진딧물이다. 아래 조건에 따라 개미 집은 제거된다. ●arr[i][j]이 개미 집 이라면, M칸 안에 진딧물이 없을 때 제거된다. ●이때 거리를 측정하는 방법은 상하좌우 인접한 칸으로 한 번 이동할 때 마다 1칸 움직인 것으로 한다. 위의 규칙에 따라 개미 집이 ..
2022.11.12
no image
[구름 알고리즘 먼데이 챌린지] Week4 : 4. 주차 구역 나누기
DP유형의 문제라는 것을 파악하고 점화식을 찾기 위해 하루 꼬박 투자했지만 결국 점화식을 구하지 못하고 해설을 봤다. 문제 난이도가 너무 높다고 느껴졌고 해설을 보고서도 이해하는데 굉장히 오래걸렸다. 해설에 파이썬 코드를 c++언어로 아래와 같이 작성했다. #include #include using namespace std; int n; deque dp; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; dp.push_back(0); dp.push_back(0); dp.push_back(1); for (int i = 3; i
2022.11.12
no image
[구름 알고리즘 먼데이 챌린지] Week4 : 3. 거리두기
문제 구름이는 구름카페를 운영하는 사장님이다. 구름카페에는 아래 그림처럼 한 줄에 3개의 테이블이 있고, 이러한 줄이 총 N 줄 배치되어 있다. 기존에는 모든 테이블에 동시에 사람들이 앉을 수 있었다. 하지만 사람들 사이에서 소음으로 자주 다툼이 발생하자, 구름이는 테이블 간 거리두기를 시행해서 일부 테이블에서만 앉아서 커피를 마시거나 작업을 할 수 있도록 하려고 한다. 테이블 간 거리두기를 시행하게 되면 어떤 사람이 앉아있는 자리에서 앞뒤와 양옆으로 인접한 테이블에는 동시에 사람들이 앉을 수 없게 된다. 구름이는 거리두기 방식에 따라, 사람들이 앉을 수 있는 테이블에 스티커를 붙이기로 했다. 구름이는 충분히 많은 스티커를 가지고 있기 때문에 붙일 수 있는 스티커의 개수에는 제한이 없으며, 스티커를 하나..
2022.11.11