본문 바로가기

Swift 자료구조 알고리즘/구현

[구현] 백준 2503 (python)

처음에 도대체 이 문제를 어떻게 푸는건지 감도 안 오고 막막했는데

계속 고민하다가 알아보니까 반복문만 있으면 되는 거였다.

 

어쩐지 세 자리로만 제한을 두어서 반복문을 써도 되는 거였고, 시간초과가 날 일도 없었다.

 

심지어 서로 다른 숫자 세 개로 구성되어있다는 제한 또한 더 쉽게 코드를 짤 수 있도록 해주는 제한이었다.

(같은 숫자도 가능했으면 스트라이크랑 볼을 세는데 꽤 애매했을 듯 하다)

 

'민혁이가 영수에게 몇 번이나 질문을 했는지를 나타내는 1 이상 100 이하의 자연수 N'

이라는 제한설정을 역시 보면 역시 아무리 케이스를 많이 줘도 시간초과가 날 일이 없음을 의미한다.

 


 

 

그래도 시간 좀 덜 걸리라고 import sys 작성했다.

 

1) 먼저 1000길이의 True 배열을 만들고, 가능성이 없는 숫자인 인덱스에는 False로 바꿔주기로 했다.

- 세자리수 이하의 인덱스와 0을 포함한 인덱스에도 False

 

2) 그리고 케이스마다 반복문을 돌리면서 1000길이의 배열을 탐색한다. False인 인덱스는 지나치고 True라면 조건을 확인한다.

 

3) 스트라이크와 볼이 해당 input에서 주어진 숫자와 같은지 확인하고 같지 않다면 False로 바꾼다.

- 이를 확인하는 과정에서는 set와 count를 사용하였다!

 

 

그리고 마지막에 전체 배열에서 True로 남겨진 갯수를 출력하면 되는 거였다!

 

(이제 제한설정이 이상하게 적다?싶으면 이런 노가다스러운 풀이도 고려해봐야겠다....^^)

 

import sys

n = int(input())
correctArray = [True] * 1000  # 0~999인덱스
for i in range(1000):
    strNumArray = list(str(i))
    if len(set(strNumArray)) != 3 or strNumArray.count('0') > 0:
        correctArray[i] = False


for _ in range(n):
    strBall = list(map(int, sys.stdin.readline().strip().split()))
    for i in range(1000):
        if correctArray[i] == False:
            continue

        inputNumArray = list(str(strBall[0])) # 입력받은
        numArray = list(str(i))
        strikeCnt, ballCnt = 0, 0
        for j in range(3):
            if inputNumArray[j] == numArray[j]:
                strikeCnt += 1
            elif numArray.count(inputNumArray[j]) > 0:
                ballCnt += 1
        if strikeCnt != strBall[1] or ballCnt != strBall[2]:
            correctArray[i] = False

print(correctArray.count(True))

 

 

 

나는 1000개짜리 배열을 만들어서 풀었는데 찾아보니까

파이썬에 itertools를 사용하면 순열과 조합을 사용해 배열을 만들어주는 함수가 있었다.

intertools.permutations(arr, 2)이런식으로 사용하면 알아서 3자리 수를 만들어준다는게 좋은듯.

스트라이크와 볼이 맞지 않다면 그 숫자 조합은 삭제해주면 된다.-> 이거는 삭제해주는것도 O(N)의 시간복잡도가 들기 떄문에 탐색해면서 True, False를 따지는 것과 걸리는 시간은 비슷할 것 같다는 생각이 든다.

 

https://velog.io/@dramatic/Python-permutation-combination-%EC%88%9C%EC%97%B4%EA%B3%BC-%EC%A1%B0%ED%95%A9

 

[Python] permutation, combination 순열과 조합

Python의 itertools를 이용하면 순열과 조합을 for문 없이 구현할 수 있다.

velog.io

 

 

'Swift 자료구조 알고리즘 > 구현' 카테고리의 다른 글

[구현] 백준 16926 (python)  (3) 2024.09.27
[구현] 백준 16505 (python)  (2) 2024.09.25