정신과 시간의 방
작성일
2024. 10. 28. 20:57
작성자
risehyun
  • 문제

 

  • 풀이
#include <iostream>
using namespace std;

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

	string n = "";
	int arr[10] = { 0, };

	cin >> n;

	for (char c : n)
	{
		arr[c - '0']++;
	}

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

	int max = 0;

	for (int i = 0; i < 9; i++)
	{
		if (max < arr[i])
		{
			max = arr[i];
		}
	}

	cout << max << endl;

	return 0;
}

 

문제를 읽어보면서 2가지를 떠올렸다.

 

1. 입력받은 값중에 가장 많이 등장한 값의 수가 필요한 세트의 수가 된다.

2. 6과 9는 서로 호환가능하기 때문에 한 세트에 2개까지 사용할 수 있다. 이를 따로 처리해주어야 한다.

 

따라서 우선 string으로 값을 받아서, 배열의 인덱스를 입력받은 값 - '0'으로 해서 저장해주었다.

문제에서 6과 9는 서로 호환이 가능하다고 했으므로 하나에 몰아서 비교하기 위해 arr[6]에 [9]의 값을 추가해주었다.

이때 홀수개로 값이 떨어지는 경우에는 추가로 한 세트를 더 필요로 하기 때문에 (arr[6] + arr[9] + 1)을 해주고 그 값을 / 2 했다.

 

이미 arr[9]의 값은 arr[6]에 반영되어 있기 때문에 max 값을 비교할 때는 범위를 0부터 9미만으로 두고 하나씩 값을 순회하며 최종 max 값을 구했다. 이 max 값이 바로 문제에서 요구하는 필요한 세트의 수가 되므로 최종적으로 이 값을 출력해주었다.

 

  • 개선

글을 작성하면서 코드를 다시 보니 max 값을 구할 때 그냥 max 함수를 사용했어도 되었을 것 같아 max 함수 사용에 익숙해질겸 그 부분만 추가로 수정해보았다.

 

#include <iostream>
#include <algorithm>
using namespace std;

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

	string n = "";
	int arr[10] = { 0, };
        int result = 0;

	cin >> n;

	for (char c : n)
	{
		arr[c - '0']++;
	}

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

	for (int i = 0; i < 9; i++)
	{
		result = max(result, arr[i]);
	}

	cout << result << endl;

	return 0;
}

 

 

// Authored by : OceanShape
// Co-authored by : BaaaaaaaaaaarkingDog, kiiimiiin
// http://boj.kr/a7a4aa95c4ee446990f868f926993161
#include <bits/stdc++.h>
using namespace std;

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  
  int N, a[10] = {}, ans = 0;
  cin >> N;
  
  // 자리수 추출
  while(N){
    a[N%10]++;
    N /= 10;
  }

  for(int i = 0; i < 10; i++){
    if(i == 6 || i == 9) continue;
    ans = max(ans, a[i]);
  }
  // (a[6]+a[9])/2를 올림한 값이 6, 9에 대한 필요한 세트의 수이므로 (a[6]+a[9]+1)/2을 계산
  ans = max(ans, (a[6]+a[9]+1)/2);
  cout << ans;
}

 

string 대신에 int로 값을 받아 while문 안에서 자리수마다 숫자를 하나씩 떼어내 그것을 인덱스로 사용해 배열에 저장하는 방식이 사용되었다. 우선 max 값을 구하는 동안 인덱스가 6과 9인 경우는 제외 한 뒤, 마지막에 다시 한번 기존의 max값과 6과 9의 필요 세트 수를 비교해서 최종적으로 결정된 값을 출력했다.

 

코드 길이도 더 간결하고 메모리도 4kb 차이긴 하지만 이쪽이 더 경량화 되었다. 아이디어를 참고해서 다음 문제 풀이에서는 이 방식으로 풀어봐야겠다.

 

'코딩테스트 > 문제풀이' 카테고리의 다른 글

[백준/10093번/C++] 숫자  (0) 2024.11.05
[백준/3273번/C++] 두 수의 합  (0) 2024.10.28
[백준/1267번/C++] 핸드폰 요금  (0) 2024.10.27
[백준/2576번/C++] 홀수  (0) 2024.10.27
[백준/2490번/C++] 윷놀이  (0) 2024.10.27