백준 1475 - 방 번호

해결 방법

0~9까지의 인덱스를 가지는 배열을 선언하고, 방 번호에 필요한 숫자들의 개수를 +1 하면 된다. 그런 다음, 가장 큰 값만큼 숫자 세트를 구매하면 된다.

어려웠던 점

✅ 9와 6에 대한 예외가 없었다면, 그냥 배열의 max 값을 뽑으면 되었을텐데, 9와 6이 서로 대체 가능하다는 점을 고려하는 게 까다로웠다. 

새로 알게 된 점

올림은 +1 한 다음 나머지를 버리면 되는구나를 알았다.

접근 방법

1️⃣ 방 번호를 가장 작은 자리수부터 탐색하며 0~9까지 인덱스를 가지는 배열의 값을 +1 하려고 했다. 그 이후 max 값에 6, 9 인덱스가 포함되어 있을 경우 예외 처리를 하려고 했다. 하지만, "max 값 확인 -> 6, 9 포함 -> 6, 9 예외처리 -> 다시 max 값 확인" 이 과정이 너무 번거로웠다.

 

2️⃣ max 값을 뽑기 전에 예외 처리를 하기로 했다. 그러면 max 값을 가지는 모든 인덱스를 확인해서 그 인덱스에6, 9가 포함되는지 확인하지 않아도 되니 1번 보다 효율적이었다. 먼저 6, 9가 공통으로 가지는 부분은 1set로 사야하는 부분이다. 그리고 그 둘의 차이는 절반만 사도 된다. 단, 그 둘의 차이가 홀수라면 한 세트를 추가적으로 구매해야 한다.

# 모든 수를 순회하면서 0~9까지 숫자가 몇 개인지 체크. 나중에 6,9를 예외처리해서 몇 개의 플라스틱 세트를 사야 하는지 확인하기
import math

N = int(input())

answer = [0]*10

while(N > 0):
  answer[int(N%10)] += 1
  N = int(N/10)

if answer[6] > answer[9]:
  answer[6] = answer[9] + math.ceil((float(answer[6] - answer[9])) / 2)
elif answer[6] < answer[9]:
  answer[9] = answer[6] + math.ceil((float(answer[9] - answer[6])) / 2)

print(int(max(answer)))

 

3️⃣ math를 사용하지 않고 올림 처리를 했다. 또한, 6, 9 인덱스를 뺀 나머지에서 max를 구하고, 6, 9인덱스 값과 비교해 max를 뽑는 식으로 로직을 수정하여 코드 길이를 단축시켰다.

N = int(input())

answer = [0]*10

while(N > 0):
  answer[int(N%10)] += 1
  N = int(N/10)

max_value = max([answer[i] for i in range(len(answer)) if (i != 6 and i != 9)])

print(int(max(max_value, (answer[6] + answer[9] + 1) / 2)))

'Algorithm' 카테고리의 다른 글

[BOJ] 3273 두 수의 합 - 파이썬  (0) 2024.08.21
[BOJ] 2577 숫자의 개수 - 파이썬  (0) 2024.08.19
[바킹독] 배열  (0) 2024.08.17
[BOJ] 10808 알파벳 - 파이썬  (0) 2024.08.06
[BOJ] 1629 곱셈 - 파이썬  (0) 2024.08.04

+ Recent posts