코딩 보완할 점/수학적 규칙을 찾는 능력을 키우는 방법

코딩할 때의 수학적 규칙을 찾는 능력을 키우는 방법

재윤 2025. 2. 8. 13:04
반응형

나는 코딩할 때나 문제를 풀 때 어떻게 풀 지는 말로는 성멸할 수는 없지만 코딩이 좀 어렵다 코딩 자체가 어려운 거는 아닌데 수학적으로 찾아나가야하는 부분인 규칙을 찾는 게 어렵다

 

예를 들어서 백준 1475번

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

 

같은 경우 0~9번에서 각 나온 번호를 카운트하고 제일 큰 수를 뽑으면 되는데 대신에 6과9에서 같은 걸로 취급을 해야 제대로 된 답이 나온다 이 때 6과 9를 같은 걸로 취급할 때가 문제인데 수학적으로 어떻게 계산을 할 거냐이다 

일단 먼저 코드부터 보자

#include <bits/stdc++.h>
using namespace std;

int arr[10];

int main(void){
  ios::sync_with_stdio(0);
  cin.tie(0);

  int n;
  cin >> n;
  fill(arr, arr + 9, 0);
  while (n)
  {
    int temp = n % 10;
    arr[temp]++;
    n = n / 10;
  }

  int temp2 = 0;
  int temp = (arr[6] + arr[9] + 1) / 2;
  arr[6] = arr[9] = temp;

  for (int i = 0; i < 10; i++)
  {
    temp2 = max(temp2, arr[i]);
  }
  cout << temp2 << "\\n";

}

 

이게 해답인데 내가 고민했던 부분이 밑 코드이다 

한국어로는 잘 생각이 나는데 이걸 찾는 게 어렵다는 걸 느끼게 되었고 지금까지 푼 문제들에서도 이 수학적 규칙을 찾는 부분이 어렵다 

즉 나한테는 수학적 직관과 패턴 인식이 부족핟,

 

  int temp = (arr[6] + arr[9] + 1) / 2;

 

이를 보완하기 위해서 어떻게 준비하면 될까

 

1. 문제를 더 작은 사례로 분해해서 직접 써보기

- 복잡한 문제를 바로 일반화하기보다는, 작은 입력으로 직접 써보면서 패턴을 찾는 연습을 하면 좋다.

예를 들어, 우리가 숫자 세트 6과9를 묶어서 처리해야 한다는 점에서 파악하려면 작은 숫자로 직접 세트를 만들어보자

 

예제 분석을 한 번해보자

 

예제1

6이 2개, 9가 2개 -> 6과 9는 서로 대체 가능 == 하나의 세트에서 하나의 6과 하나의 9를 사용할 수 있음

세트 개수 ==(2+2) / 2 = 2

6699

 

예제 2

6이 3개, 9가 1개 -> 6과 9를 쌍으로 묶을 수 있는 최대 개수는 1개 

남은 6하나는 추가 세트가 필요 -> (3+1) / 2 = 2

6669

 

예제 3

6이 3개, 9가 2개 -> 6과 9를 최대한 쌍으로 묶으면 (2,2) -> 1세트 소모

남은 6 하나는 추가 세트가 필요 (3+2) / 2 = 3

66699

 

이 과정을 여러 개 써보다 보면 짝수일 때는 2로 나누면 되고, 홀수 일 때는 올림해야한다는 걸 발견하게 됨 즉 공식이 만들어짐 

연습 방법은 다양한 숫자 입력을 손으로 써서 계산해보고 반복되는 패턴을 찾는 연습

 

2. "규칙화"된 문제를 많이 풀어보기

이런 유형의 문제를 자주 풀어보면 수학적 직관이 길러짐 특히 개수를 세서 최적화하는 문제를 자주 접하면 익숙해질 것이다.

즉, 나는 지금 현재 문제를 많이 풀어보지 않았다라는 말도 성립

 

추천 문제 유형

  • 짝수/홀수 고려해야 하는 문제
    • 백준 5585번 "거스름돈" → 동전을 최소 개수로 거슬러 주는 문제
    • 백준 2839번 "설탕 배달" → 5kg과 3kg 봉지로 최소 개수의 설탕 배달
  • 조합해서 최소 개수를 구하는 문제
    • 백준 11047번 "동전 0" → 최소 개수의 동전으로 금액을 만들기
    • 백준 2217번 "로프" → 여러 개의 로프로 최대 하중을 구하는 문제

이런 문제를 풀다 보면 어떤 숫자를 그룹으로 묶어야 하는지, 어떻게 나눠야 하는지 직관이 생길 것이다.

 

3. 직접 코드 없이 해결해보는 연습

보통 바로 코드를 짜려고 하면 패턴을 찾지 못하고 헷갈리기 쉬워요. 대신 다음 과정을 연습해보자.

  1. 문제를 읽는다.
  2. 작은 입력값을 몇 개 적는다.
  3. 손으로 해결해 본다.
  4. 어떤 규칙이 있는지 찾아서 공식을 만든다.
  5. 마지막으로 코드로 구현한다.

예를 들어, 위 문제는 이렇게 풀어볼 수 있다.

  1. 숫자 개수를 센다.
  2. 6과 9는 묶어서 하나의 세트로 처리해야 한다.
  3. 전체 개수를 2로 나누고, 나머지가 있으면 올림을 한다.
  4. (총 개수 + 1) / 2를 하면 정확하게 나온다.

 

4. 수학적 아이디어를 코딩에 적용하는 연습

코딩 문제에서는 자주 쓰이는 수학적 패턴이 있다. 그중 특히 중요한 개념은 "나눗셈에서 올림 처리" 

✅ 나눗셈 올림 처리 공식:

 
(int)(x + y - 1) / y  // x를 y로 나눈 값을 올림한 결과

이 공식은 ceil(x / y)와 같은 효과를 가진다.

예를 들어, 우리가 5를 2로 나눠서 올림해야 한다면:

(5 + 2 - 1) / 2 == 3

이 개념을 이해하면 위와 같은 공식을 쉽게 떠올릴 수 있을 것이다.

👉 연습 방법

  • ceil(a / b)가 필요한 문제를 찾고 수식으로 변환해보자.
  • 위에 제시한 문제(거스름돈, 설탕 배달, 동전 문제)들을 연습하면 이 개념을 익히는 데 도움이 될 것이다.
반응형