사실 이번 천코대 대회를 준비하면서 머리는 부족하지만 여러 문제를 풀어보고 싶었다. 확실히 복습과 배움이 부족했던 것 같고 스스로 학습하고 복습하는 태도를 가져야 할 것 같다. 아무튼 문제들로 넘어 가겠다.
1. 분산처리
https://www.acmicpc.net/problem/1009
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int t;
int num, base_num;
int sum = 1;
scanf("%d", &t);
for (int i = 1; i <= t; i++) {
scanf("%d %d", &num, &base_num);
for (int j = 2; j <= base_num; j++) {
sum = (sum * num)%10;
}
if (sum == 0) {
sum = 10;
}
printf("%d",sum);
}
}
문제 자체의 핵심은 6 4 이라고 입력이된다면 6의 4제곱 값의 1의 자릿수를 보아야하는 문제다 6의 4제곱은 1216이다 따라서 6번 컴퓨터에 데이터가 저장되어야 한다는 문제로 개념은 안거 같지만 어디서 잘못된것인지 잘 모르겠다.
일단 바깥 포문은 몇번 입력 받는지에 따른 포문이니 무시한다. 안쪽의 포문이 2부터 시작하는 이유는 모두 알다시피 제곱수에서 2의1제곱은 2이기 때문이다 따라서 2제곱부터 계산하게 되는것이고 포문을 돌리면서 sum 에 제곱 값의 일의 자릿수만 남을 수 있도록 만들어준다. 그렇기에 일의 자릿수가 0일땐 10으로 인식해 10번 컴퓨터에 데이터를 저장하게 하는 것이다. 따라서 제곱수의 1의 자릿수는 저장해야할 컴퓨터의 번호이기 때문에 출력을 sum 값으로 정해주게된다.
언뜻보기엔 if 문으로 10번 데이터를 저장해주는 값도 만들었고 다 좋아보인다 하지만 출력값이 다르게 나타난다.
문제에서 제시하고 있는 예제 출력 값이다 : 1 7 6 1 9 첫번째 값은 맞지만 다음식부턴 이상해진다. 이유를 모르겠으나 필자가 빠트리게 분명히 있을 것이고 그것을 더 공부해봐야겠다.
2. 준오는 조류혐오야
https://www.acmicpc.net/problem/14647
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
int n, m;
int jum, mum = 0, max = 0, tmep = 0, temp1=0;
int x[500][500];
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &jum);
x[i][j] = jum;
}
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (x[i][j] % 10 == 9 && (x[i][j]%10)%10==9) {
mum+=2;
}
else if (x[i][j] % 10 == 9 || (x[i][j] % 10) % 10 == 9) {
mum++;
}
}
if (max<mum) {
tmep += mum;
max = mum;
mum = 0;
}
else if (max > mum) {
tmep -= max;
mum = 0;
break;
}
}
printf("%d", tmep);
}
이번 문제에서는 준오는 조류를 혐오하기 처음 테스트 케이스로 빙고판의 크기를 구한다. 따라서 n*m의 빙고판이 되어야하니 for 문을 돌려주게 된 것이다. 빙고판을 돌려주면서 이차원배열안에 입력값을 넣어 주었다.
이 문제의 핵심은 입려고딘 빙고판에서 9가 가장많은 행 또는 열을 삭제하고 남는 9의 값을 출력해주면 되는 문제이다.
현재 배열안에 값이 모두 제대로 들어간 것을 확인할 수 있지만 결과값이 이상하다 결과 값은 9가 가장 많은 행인 3번째 행을 지움으로써 9가 2개가 남아 2이기 때문이다.
일단 이 문제에서 주의해야 할 점은 예제 입력 2에서 나온다.
4 4
11 12 19 14
99 39 14 90 바로 이 빙고판인데 놀랍게도 이 빙고판은 99를 9 2개로 센다! 당황스럽다 매우.
13 47 81 99
32 72 29 66
따라서 이 문제에서 구해야 할것은 9가 가장많이 들어있는 행과 열을 구해야하고 이중에서 99는 9 2개 90 은 9 1개로 읽어야 하는 것이다. 저 코드에서는 열(세로)을 읽는 법을 모르겠어서 가로로만 최대한 구현해보았다.
처음 빙고판을 입력받았을때와 동일한 방법으로 배열을 읽어준다. 읽으면서 9가 들어있는지 안들어있는지를 판독하게 된다. max의 초기값을 0으로 주고 읽은 행의 9의 개수가 max 보다 클때 max 에 읽은 행의 9의 갯수를 대입해준다. 그리고 ++로 계산하면 예전행의 9의 갯수에 계속해서 더해지기 때문에 max 값에 대입해준 후 9를 세주는 mum 변수를 0으로 초기화 해줍니다. 이때 max의 값이 행의 9의 개수보다 더 이상 작지 않을때 모든 9의 개수를 더한 값에서 9의 최대 갯수를 빼줍니다. 그리고 그것을 출력하면 짜쟌
답이 이상하게 나옵니다. 9의 갯수를 세는 부분에서 문제가 있었던것 같다. 아마 9의 갯수를 세는 조건문에서 else if 에 || 을 사용한것이 문제가 되어 값들이 이상하게 세어진건 아닐까 라고 생각하고 있으며 고쳐봐야겠다.
3. 개미
https://www.acmicpc.net/problem/2136
이번 문제는 개미 / 에드 훅으로 분류되는 문제로 해볼만 하지 않을까 하고 시작했으나 대차게 깨진 문제이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
int cm, A, whr;
int g[] = { 0 }; //시작 위치 저장
scanf("%d %d", &cm, &A);
for (int i = 0; i < cm; i++) {
scanf("%d", whr);
g[i] = whr;
}
for (int i = 0; i < sizeof(g); i++) {
if (g[i] < 0) {
g[i] = -1 * g[i];
while (true)
{
int j = g[i];
if (j < 0) {
printf("%d %d", g[i], j);
break;
}
j--;
}
}
else{
while (1) {
int j = g[i];
if (j > A) {
printf("%d %d", g[i], j);
break;
}
j++;
}
}
}
}
이번 문제의 핵심은 바로 개미의 출발 시간과 떨어지는 시간 그리고 충돌시간이다. 사실 풀때는 충돌시간 또한 계산에 넣어야한다는 점을 몰라 코드는 충돌했을때의 계산 값이 없다. 아무튼 시작하자면 첫 줄에 문제에도 나와있다싶이 개미의 마릿수와 개미들이 지나가게 되는 다리의 총길이가 입력된다.
for 문을 돌려서 배열에 개미들의 출발 지점을 입력 받는다. 이때 유의해야할점은 시작지점이 음수값으로 입력된 것은 절댓값에서 시작하는걸로 통용되며 절댓값에서 0으로 향하는 운동이 된다는 것이다.
그렇기에 이런 반복문이 나오게 된다. 배열의 길이만큼 돌면서 배열안의 값이 음수면 -1 을 곱해주어 양수로 만든다. 그리고 그때부터 반복문을 돌려 시작 지점 값을 -- 시켜주고 떨어지는 시간을 출력하게 된다 왜냐하면 결국에 개미는 1초에 1씩 이동하게 되고 그렇다면 0버다 작아질때까지 걸린 길이가 곧 시간이 되기 때문이다.
하지만 놀랍게도 이 문제는
런타임 에러가 뜨게 된다. 당황스럽다. 비주얼 스튜디오에서는 처음변수로 받는 whr이 초기화되지 않았다고 했고 이것을 0으로 초기화해준채 배열에 입력값을 넣게되면 입력값은 받을 수 있지만 또 다시 런타임 에러가 뜨게된다. 당황스럽다.
거의 다 풀었다고 생각한 순간 큰 벽을 만난 것이다. 아마 sizeof(a)에서 오류가 나는 것이 아닌가 싶고 배열과 에드 훅 문제 유형에 대해서 더 공부해 풀어봐야 할 것 같다.
'C,C++' 카테고리의 다른 글
2167번 2차원 배열의 합 (0) | 2021.07.21 |
---|---|
11047번 동전0 (0) | 2021.06.19 |
10773번 제로 C (0) | 2021.06.15 |
백준 20492번 세금 (0) | 2021.06.09 |
C 포인터 (0) | 2021.06.06 |