반응형
DoZZang
Do IT
DoZZang
전체 방문자
오늘
어제
  • Programming
    • Git
    • Web
    • 기타
    • Python
      • CodeUp
    • Math
    • Algorithm
    • Baekjoon
    • C,C++
    • Life
      • 독서
      • Just
      • 영화

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DoZZang

Do IT

[C++] 1475번 : 방 번호
Baekjoon

[C++] 1475번 : 방 번호

2024. 2. 22. 16:25
반응형

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

 

1475번: 방 번호

첫째 줄에 다솜이의 방 번호 N이 주어진다. N은 1,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

풀이

 

한 세트에는 0번부터 9번까지 숫자가 하나씩 들어있다.

-> 대놓고 배열을 사용하여 풀라고 한다.

 

문제에서 신경써줘야 하는 부분은

'6은 9를 뒤집어서 이용할 수 있고, 9는 6을 뒤집어서 이용' 이다.

 

일단 단순하게 방번호가 9999인 경우 2set가 필요함을 알 수 있다.

그렇다면 99999의 경우는?

당연히 3set일 것이다.

이에 따라 홀수/짝수 경우를 나눠

홀수 -> 2로 나누고 + 1 , 짝수 -> 2로 나누기 연산을 수행해서 최댓값을 구하고자 하였으나, 66699 라는 반례가 존재했다.

정답은 3set인데, 위 논리대로라면 v[6] == 3이고 v[9] == 2이니 3 / 2 + 1로 2set가 출력될 것이다.

이는 원하는 결과가 아니다!

 

따라서 toggle을 이용해보기로 하였다.

홀수번째의 6또는 9를 식별 시 요소의 값을 1늘려주고, 짝수번째는 늘려주지 않는 방식이다. (배열의 6이나 9 index만을 취급해야 한다는 점에 주의!)

뮨제는 풀렸지만 코드가 길다.

 

코드

 

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

bool toggle = 1;

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

	vector<int> v(10);

	while (N != 0) {
		int temp = N % 10;
		N /= 10;
		if ((temp == 6 || temp == 9) && toggle == 1) {
			v[6]++;
			toggle = 0;
		}
		else if(temp == 6 || temp == 9){
			toggle = 1;
		}
		else {
			v[temp]++;
		}
	}
	auto max = max_element(v.begin(), v.end());
	cout << *max;
}

 

 

처음 내가 접근했던 홀수/짝수로 접근하는 것이 아닌

같다고 취급하는 것에서 두 수를 더해 2로 나눈다는 마인드가 필요했다. (마치 평균 구하듯이)

이 때 또 주의할 점은 더하고 + 1을 해줌으로써 두 요소의 값 중 큰 값이 최종적으로 출력되게 할 수 있었다.

(혹은! 내 위 코드처럼 배열의 6이나 9 index에 1씩 늘려가고 마지막에 arr[6] + 1 / 2 해도 되었다!)

 

+while(N != 0)은 당연히 while(N)으로 바꿔 사용할 수 있다. 코드를 줄이자!

 

모범 코드

// 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;
}

 

반응형
저작자표시 (새창열림)

'Baekjoon' 카테고리의 다른 글

[C++] 1919번 : 애너그램 만들기  (0) 2024.02.23
[C++] 백준 3273번 : 두 수의 합  (0) 2024.02.22
[C++] 2577번: 숫자의 개수  (0) 2024.02.21
[C++] 10808번: 알파벳 개수  (0) 2024.02.21
[C++]백준 10804번: 카드 역배치  (1) 2024.02.08
    'Baekjoon' 카테고리의 다른 글
    • [C++] 1919번 : 애너그램 만들기
    • [C++] 백준 3273번 : 두 수의 합
    • [C++] 2577번: 숫자의 개수
    • [C++] 10808번: 알파벳 개수
    DoZZang
    DoZZang
    과정은 힘들지만 성장은 즐겁습니다.

    티스토리툴바