상세 컨텐츠

본문 제목

< 백준 BaekJoon : 3052번 나머지 > C++

C++/Baekjoon

by J2on 2021. 9. 19. 20:17

본문

이 문제는 내가 좀 신기한 방법으로 푼것 같다.

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

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

이 문제도 간단하다.

모든 수를 입력받고 %10 해준 후 서로 다른 나머지 값을 수를 출력한다.

 

 

<<문제 풀이 방법>>

이땐 왜 이렇게 풀었는지 잘 모르겠는데 일단 이렇게 풀었으니 이렇게 쓰겠다.

 1. 각각의 숫자를 정수 배열(1)을 통해 입력받는다.

 2. 반복문을 사용해 배열의(1) 각각의 원소가 자신을 포함해 몇번이나 사용 되었는지 확인한다.

     이 때 같은 크기의 배열(2)을 하나 더 만들어 원래 원소의 자리에 사용된 횟수를 입력한다.

 3. "1/배열(2)의 원소" 값을 출력값인 Count 변수에 더한다.

       ◆◆◆ 이게 무슨 소리냐면 ◆◆◆

     어떠한 원소가 배열(1)에서 두번 사용되었을 경우

     배열(2)에서는 [1][1][1][1][1][1][1][2][1][1][1][2] 이러한 모습이 되고

     Count = 1/2 + 1/2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 9

     따라서 9가지 나머지가 사용된 것이다.

 

     예시를 더 들어보자면 

     배열(2)가 [5][5][5][3][3][5][3][2][5][1][1][2] 인 경우

     Count = 1/5 + 1/5 + 1/5 + 1/5 + 1/5 + 1/3 + 1/3 + 1/3 +1/2 + 1/2 + 1/1 + 1/1 = 5

     따라서 5가지 나머지가 사용된 것이다.

 

<<Code>>

#include <iostream>
using namespace std;

int main() {
    // (1)
  int NumArray[10];
  for(int i=0; i < 10; ++i) {
    cin >> NumArray[i];
    NumArray[i] %= 42;
  }
  
    // (2)
  int NumArray2[10] = {0,};
  for (int i = 0; i < 10; ++i) {
    for (int k = 0; k < 10; ++k) {
      if (NumArray[i] == NumArray[k]){
        NumArray2[i]++;
      }
    }
  }
  
    //(3)
  /// 각 배열의 수들이 몇개씩 써졌는지 확인
  float Count = 0;
  /// 써진 수를 총 num으로 나누어서 더해줌 ㅋㅋ
  for (float Num:NumArray2){
    Count += 1/Num;
  }
  cout << Count << "\n";
  return 0;
}

 

요상하게 풀었네

 

<<GitHub>>

https://github.com/J2on/BaekjoonOnlineJudge/blob/master/Code/Baekjoon_3052.cpp

관련글 더보기

댓글 영역