https://www.acmicpc.net/problem/4375

#include <stdio.h>

int main(void) {
    int n, c = 1;
    long long num = 1;


    while (~scanf("%d", &n)) { // EOF 입력입니다.
        num = 1;
        c = 1;
        while (1) {
            if (num % n != 0) {
                num = (num % n) * 10 + 1; //여기가 함정
                c++;
            }
            else {
                printf("%d\n", c);
                break;
            }
        }
    }
    return 0;
}

맨 처음에 문제만 보고 쉽다고 생각했는데, 함정이 있었습니다.

위에 보시면 제가
num = (num % n) * 10 + 1
이라고 적어놨는데요, 처음엔 이렇게 적지 않고
num = num * 10 + 1
이렇게 적었습니다. num이 1, 11, 111, 1111, 11111, ...... 이렇게 증가하면서 연산되길 바라면서요.

근데 출력이 안 되고 코드가 멈춰버리더라고요. 정수 오버플로우가 되는 것이었습니다.

9903을 넣으면 1이 3300자리가 나온다고 합니다.

ps 오픈채팅과 백준 질문글의 도움을 받았습니다.

아무튼
num = (num % n) * 10 + 1
이것을 사용하면 앞의 몫은 날아가고 나머지만 남는 것을 알 수 있습니다.
사실 몫은 필요가 없습니다. 한 번 나눠졌다면 몫에 어떤 자연수를 곱하던간에 또 나눠질게 뻔하니까요.

오늘은 참고하셔도 되겠습니다.

감사합니다.

https://www.acmicpc.net/problem/1051

 

1051번: 숫자 정사각형

N×M크기의 직사각형이 있다. 각 칸에는 한 자리 숫자가 적혀 있다. 이 직사각형에서 꼭짓점에 쓰여 있는 수가 모두 같은 가장 큰 정사각형을 찾는 프로그램을 작성하시오. 이때, 정사각형은 행

www.acmicpc.net

처음에 보고 쉬운 문제인 줄 알고, 30분 안에 풀고 다른 공부를 하려 했습니다.

ㅎ 거의 2시간이 걸렸네요

#include <stdio.h>

int main(void) {
    int a = 0, b = 0;
    int small, big;
    char arr[100][100] = {};
    scanf("%d%d", &a, &b);

    for(int i = 0; i < a; i++) {
            scanf("%s", arr[i]);
    }
    if (a <= b) {
        small = a;
        big = b;
        a--;
        b--;
        for(int k = 0; k <= a; a--) {
         for(int i = 0; i < small - a; i++) {
            for(int j = 0; j < big - a; j++) {
                if (a == 0) {
                    printf("1");
                    return 0;
                }
                else if (arr[i][j] == arr[a + i][j] && arr[i][a + j] == arr[a + i][a + j] && arr[i][a + j] == arr[i][j]) {
                    printf("%d", (a + 1) * (a + 1));  
                    return 0;           
                }
            }
         }
        }
    }
    else {
        small = b;
        big = a;
        a--;
        b--;
        for(int k = 0; k <= b; b--) {
         for(int i = 0; i < big - b; i++) {
            for(int j = 0; j < small - b; j++) {
                if (b == 0) {
                    printf("1");
                    return 0;
                }
                else if (arr[i][j] == arr[b + i][j] && arr[i][b + j] == arr[b + i][b + j] && arr[i][b + j] == arr[i][j]) {
                    printf("%d", (b + 1) * (b + 1));  
                    return 0;      
                }
            }
         }
        }
    }
}

삼중 for문은 처음 써보네요. ㅎ

 

제가 이 문제를 2시간 동안 풀고 설명해드릴 염치는 없습니다.

다 풀고 검색해보니, Elly라는 분이 정말 잘 풀어두셨더라고요.

 

혹시나 실수로 제 블로그에 들어와서 이런 더러운 코드를 보셨다면

이렇게 푸는 사람도 있구나.

하시고 Elly 님의 네이버 블로그를 참고하시면 좋을 것 같습니다.

 

나중에 제가 더 똑똑해지면 무슨 생각으로 코드를 짰는지 수정하여 추가하겠습니다.

정말 많이 틀렸네요.

그래도 맞춰서 기분은 좋습니다.

 

 

감사합니다.

'백준' 카테고리의 다른 글

[C언어] 백준 | 24228번 젓가락  (0) 2022.04.01
[C언어] 백준 | 11057번 오르막 수  (0) 2022.03.31
[C언어] 백준 | 11720번 숫자의 합  (0) 2022.03.30
[C언어] 백준 | 4375번 1  (0) 2022.03.29
[C언어] 백준 | 2164번 카드2  (0) 2022.03.26

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

풀이

 

배열을 처음에 크게 준 다음에 처음에 카드의 장 수(n)만큼 배열의 첫 번째부터 넣어줬습니다.

 

그 다음에 for문을 사용해 짝수 번째에 있는 카드를 순서대로 맨 처음 생성된 배열의 뒤에 빈 공간에다가 채워줬습니다.

만약 다음 배열이 비어있다면 마지막 배열인 것으로,

for문에 if를 넣어줘서 마지막 배열이라면 출력해주도록 했습니다.

 

그리고 n = 1 일 땐

arr[0] 에 1이 채워져 있는데

for문이 arr[1] 부터 확인을 해줘서 예외가 뜨기 때문에 

맨 마지막에 예외를 넣어줬습니다.

#include <stdio.h>

int main(void) {
    int arr[2000000] = {};
    int n, a = 0;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }
    for (int i = 1; i < 1000000; i++) {
        arr[n + a] = arr[i];
        i++;
        a++;
        if(arr[i + 1] == 0 && arr[i] != 0) {
            printf("%d", arr[i]); //마지막 숫자가 맞는지 확인하기
        }
    }
    if (n == 1)
    printf("1");
    return 0;
}

근데 다른 분들 푸신 방법 보니까 큐라는 제가 모르는 걸 사용해서 푸시던데, 이렇게 풀면 안 되는 건가요?

 

제 방법으로는 쉽다고 느껴서 10분 정도만에 푼 것 같은데...

+ Recent posts