본문 바로가기
# 공부/# 그 외 흥미로운 문제들

[백준::1475 Py] 방번호

by 쁘레레레레레 2021. 12. 9.

못풀었었던 문제 중 두번째

 

문제는 간단히 말해서  0~9가 적힌 스티커가 있고, 어떠한 방 번호 N이 들어왔을때

총 몇 세트가 필요하느냐?라는 것이다.

 

0~9의 스티커는 한 세트이고, 단 6와 9는 뒤집어서 쓸 수있다. 즉 6이 없을때 9를 6으로 뒤집어 사용이 가능하다는것.

 

쉬울줄 알았는데 의외로 좀 까다로웠다.

우선 str형으로 받아주고 해당 숫자의 크기를 재서 몇자리인지 나눴고

세트의 수를 count로 세주려다가 코드가 불필요하게 길어져서 연산은 더 많아지지만 내가 편한방향으로 코딩했다.

그게 바로, 2차원 배열을 하나 만들어놓고 세트가 필요할경우 2차원 배열 내부에 1차원 배열을 append하는 식으로 진행했고, 269945처럼 2세트로도 가능한 결과를 잘못계산해서 3세트가 나오는 등을 고려해야한다.

 

코드를 글로 간결하게 적자면

1. 2차원 배열 내부에 1차원배열 단 하나만 선언. 해당 리스트의 0번째는 첫번째 세트의 주소

2. 세트의 수 만큼 해당 숫자가 있는지 없는지 체크한다. 단 6,9의 경우 추가 연산이 필요한것 같음

2의 경우 999933에서 99까진 한세트로 가능하고, 9가 더 나온이상 두번째 세트가 추가되고, 33은 첫번째 세트에서 가져오면 되는데, 단순 count를 추가해 셀 경우 이게 좀.. 그렇다

 

물론 0번째부터 차례대로 순환하라는것도 된다.

 

3. 2차워 배열안에 몇개의 배열이 있는지 센다. 그게 곧 정답

 

여기서 약간 아이러니한점이 반례 중 9999333이 있는데, 분명 N은 1백만 이하라고 적혀있는데 9999333의 케이스를 통과시키니 맞았습니다가 뜬다.

 

뭐 근데, 9999333이 통과가 안됐단건 999933도 안됐단거더라

 

추가로 try except구문이 있는데, 귀찮아서 저렇게 처리했다.

해당 카드셋의 6,9 개수를 세어서 이 중 하나라도 있을경우 우선 6부터 제거하게 했다.

9999의 경우 0~9중 6을 삭제하고, 두번째 9에서 6을 삭제하려니 valueError가 떠서 그걸 try except로 잡아준것이다.

어차피 여기서 6과 9는 같은 숫자라고 봐도 되기때문

 

필요없는 코드가 있을 순있다. 중간에 코드 절반을 뒤엎는 중 미쳐 삭제하지 않은 코드들인데, 어차피 통과하는게 목적이라 I don't care~

 

 

 

 

 

 

 

 

 

코드주의 

 

 

 

 

 

 

 

 

 

 

 

 

#[백준::1475 Py] 방번호

import sys

def checkRoom(room,data):
    for i in range(len(room)):
        if data == 6 or data == 9:
            if room[i].count(6) or room[i].count(9):
                return i
        if room[i].count(data):
            return i
            
    return 99

# 6 <-> 9 / 0~9 1set
def main():
    nInput = sys.stdin.readline().rstrip() # rstrip도 가능
    template = [_ for _ in range(10)]
    checkNumber = [template[:]]
    splitList = [int(_) for _ in nInput]
    for i in splitList:
        compareData = checkRoom(checkNumber,i)
        if compareData == 99:
            checkNumber.append(template[:])
            compareData = checkRoom(checkNumber,i)
        nData = i
        if nData == 6 or nData == 9:
            try:
                checkNumber[compareData].remove(6)
            except ValueError:
                checkNumber[compareData].remove(9)
        else:
            if checkNumber[compareData].count(i):
                checkNumber[compareData].remove(i)

                
    print(len(checkNumber))

main()