최코딩의 개발

[백준 2503번] 숫자 야구 본문

코딩테스트/백준

[백준 2503번] 숫자 야구

seung_ho_choi.s 2025. 2. 9. 18:07
728x90

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

 

=begin
1. 입력을 받고 저장하자.
2. 모든 경우의 수를 다 넣어서 검증을 해보자
3.
=end

# 입력
N = gets.chomp.to_i
input = []
N.times do
  data = gets.chomp.split.map(&:to_i)
  input.push(data)
end

def solution(i, j, k, input)
  cnt = 0

  for l in 0...N
    s = 0
    b = 0
    data = input[l]
    num = data[0].to_s
    # 첫자리
    if i.to_s == num[0]
      s += 1
    elsif i.to_s == num[1] || i.to_s == num[2]
      b += 1
    end

    # 두자리
    if j.to_s == num[1]
      s += 1
    elsif j.to_s == num[0] || j.to_s == num[2]
      b += 1
    end

    # 마지막자리
    if k.to_s == num[2]
      s += 1
    elsif k.to_s == num[1] || k.to_s == num[0]
      b += 1
    end

    if s == data[1] && b == data[2]
      cnt += 1
    else
      return 0
    end
  end

  return cnt
end

# 정답 찾기
result = 0
# 모든 경우의 수 판단
for i in 1..9
  for j in 1..9
    if i == j
      next
    end
    for k in 1..9
      if j == k || i == k
        next
      end
      answer = solution(i, j, k, input)

      if answer == N
        result += 1
      end
    end
  end
end

puts result

 

 

문제 해결의 핵심은 모든 가능한 경우의 수를 생성한 후, 입력값과 비교하여 일치하는 경우 카운트를 증가시키는 것이었다.
이렇게 얻은 카운트 값이 N과 같으면 최종 결과를 1 증가시키는 방식으로 접근했다.

그러나 여러 실수가 있었다.
s=0, b=0처럼 병렬로 변수를 선언했더니 배열로 인식되어 오류가 발생했고,
중복 숫자를 방지하기 위해 && 조건을 추가했지만, 이 방식은 111, 222 같은 경우만 막을 뿐 112, 221 같은 조합은 허용해버렸다.
또한, 함수 선언을 코드 맨 위가 아닌 아래에 두는 실수를 범해 오류를 초래했다.

문제를 푸는 데에는 오래 걸리지 않았지만, 오류를 잡느라 시간이 많이 소요되었다.
앞으로는 코드를 더 꼼꼼하게 점검하며 실수를 줄이도록 해야겠다.

728x90