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

[백준::11652 Py] 카드

by 쁘레레레레레 2021. 12. 11.

역대급 혈압오르는 문제였다.

애초에 로직이 복잡하면 모를까, 로직도 간단한데 도저히 어디서 걸리는줄 계산이 안됐다.

질문검색으로 가서 그곳에 있는 모든 글을 읽고 반례를 전부 가져와서 입력해봤다.

일부러 공백에 유니코드값이 몰래 붙을까봐 손으로 하나하나 입력했다.

검증도 몇번이나 거쳤는데 계속 틀렸다고 나와서 코드를 엎어버렸다.

 

하지만 틀린다면, 가장 틀릴법한곳이 존재했고, 그곳을 날려버리고 맨바닥에서부터 다시 시작하니 코드가 손쉽게 통과됐다.

 

솔직히 아직도 잘 모르겠다. 기존의 코드가 함수를 두개를 써서 약간 이리저리 얽히긴했는데, 흠.. 

 

어쨋든 이 문제는 매우 간단하다.

 

일단 조건을 보면

1. 테스트케이스 N은 최대값이 10만이다.

2. 입력 값 M은 -2^62 ~ 2^62까지 범위이다. (Big Number Calculator 큰 수 계산해주는 사이트)

3. 값이 같을경우 더 낮은값을 출력해라.

 

문제를 보자마자 풀이가 바로 생각났다.

일단 문제자체는 꽤 친절한편이다.

이번에 알았는데, 파이썬의 경우 int와 str형이 범위가 없더라.. C를 기반으로 공부했고 지금도 메인언어가 C++인만큼 당연하게도 2147483647이라고 생각을 했는데 뭐 이건 문제가 아니였다.

 

어떠한 수 x가 들어온 개수 y개를 세어보는건데, 일단 위에 말한것처럼 int의 범위를 고려하기도 했고 배열로 무식하게 초기화하기 싫어서 hash table형식으로 풀려고 했다.

 

파이썬엔 너무 편한 딕셔너리가 있다. 일단 int형이 무제한이라 받아오는 값을 바로 캐스팅해줘도 되지만, 내 경우 처음엔 문자열로 받아서 계산했었다.

해당 값:개수 형식으로 계산을 했다.

그러면 굳이 멍청하게 최소 10만개를 초기화하고 시작하거나 2^62개를 초기화한다는 무식한짓을 안해도 된다.

 

로직은 이러하다.

딕셔너리를 생성한 후 입력받은 값을 딕셔너리의 키로 받을것이다.

만약 해당 딕셔너리의 키 값이 없다면, 딕셔너리의 키로 입력하고 값은 1을 준다.

만약 이미 있는 값이라면, 값에 +=1을 해준다.

 

그렇게 몇개든 입력을 받은 후 모든 키를 순서대로 변수에 넣어주는 방식으로 반복문으로 만들어준 후

딕셔너리[키값]이 최대값보다 크다면 값을 대체하는 방식으로 진행했다.

 

물론 같은 경우도 계산을 해야한다.  6 1 1 2 2 3 4일경우, 1이 2개 2가 2개이므로 value값이 같고 그 중 더 낮은값을 고르게 해야하기때문이다.

 

여러모로 짜증나는 문제였다. 차라리 문제가 어려웠으면 내가 널 죽이고 죽겠다라는 마음가짐으로 즐겁게 덤비는데, 이건 뭐.. 마치 귀여운 강아지가 갑자기 날 물어버린것 같은 기분...  엄청 귀여운데 이새끼가? 싶으면서도 또 자존심떄문에 무시는 못하겠고  

 

아무튼 코드주의

 

개인적으로 문제를 푼 경우 테스트케이스도 알려주면 좋지 않을까 싶다.

어차피 문제 검색만해도 코드는 널려있고 사실 테스트케이스에 관심이 있는 사람이 더 많을텐데

 

아래는 반례이고 코드는 더 밑에있다.

5
-5
-5
-2
-12
-2

=========
6
2
1
2
1
2
1
===========


============
6
-3
-2
-1
0
0
1
===========

10
1
1
1
1
2
3
3
3
3
3
==========

5
2
2
1
1
3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import sys

def main():
    inputTestCase = int(sys.stdin.readline())
    saveDict = dict()
    for i in range(inputTestCase):
        inputData = int(sys.stdin.readline().rstrip())
        if saveDict.get(inputData) != None:
            saveDict[inputData] += 1
        else:
            saveDict[inputData] = 1
    
    maxKey = 0
    maxValue = 0

    for i in saveDict.keys():
        if saveDict[i] > maxValue:
            maxKey = i
            maxValue = saveDict[i]
        elif saveDict[i] == maxValue:
            if i < maxKey:
                maxKey = i
    
    print(maxKey)

main()

'# 공부 > # 그 외 흥미로운 문제들' 카테고리의 다른 글

[백준::1966 python3] 프린터 큐  (0) 2021.12.30
[백준::5430 python3] AC  (0) 2021.12.21
[백준::1735 Py] 분수합  (0) 2021.12.09
[백준::1475 Py] 방번호  (0) 2021.12.09
#[백준::1212] 8진수 2진수  (0) 2021.12.09