[백준] 민겸 수

유승선 ·2022년 6월 10일
0

백준

목록 보기
19/64
post-thumbnail

내가 고질적으로 가지고 있는 특징 중 하나가 난 무언가 너무 아쉽다고 느끼거나 찜찜하다고 생각하는게 있다면 평소에는 신경도 안쓰는것도 이상하게 집착 하게되어서 광기처럼 변하고 그것부터 해결해야 다른걸 할수있다 라는 생각을 가지게된다. 이게 인간관계에서는 많이 없는데 코딩테스트 문제들만 보면은 이런 광기 넘치는 집착이 생기는거같다. 최근들어서 풀었던 문제중에 난이도가 어려워가지고 진이 빠지게 아이디어를 생각하고 너무 긴 코드를 적어서 마지막에 풀었을때 힘이 없어지는 문제는 있었지만 이렇게 문제를 다 풀고나서 화가 났던건 오랜만인거같다. 그만큼 문제가 너무 어이없었고 테스트케이스를 누가 만들었는지 모르겠지만 c++ 를 사랑하는 사람으로서 이게 리트코드 같이 문제를 유저가 평가 할수있었다면 나는 뒤도 안돌아보고 싫어요를 눌렀을거다.

솔직히 문제 자체가 쓰레기인건 아니다. greedy 하게 생각하는 방법을 유도하고 아이디어를 구상하는데 있어서 유익한 시간에 고민거리를 주었기 때문이다. 문제 내용부터 살피면은 M과 K로만 이루어진 문자열이 input 으로 주어진다. 그리고 각자 M 과 K에 해당하는 숫자들이 다른데 위에 있는 표를 보고 인풋으로 주어진 문자열에서 M값과 K값을 적절히 골라 가장 큰 값과 또 가장 작은 값을 리턴하면은 되는문제이다.

일단 이 문제를 자세히 보면은 생각할수있는게 어떤 문자열을 합쳐놔도 결국에 K는 한개뿐이고 M은 0개가 될수도 있고 중복이 여러겹으로 변할수도 있다. 그리고 M이 여러개인 경우여도 결국 K는 하나이기때문에 우리는 K의 문자를 봤을때 만들수있는 최대치를 구하면 됐었다. 그 예시로, MK 같은경우 표를 보고 가장 크게 만들수있는 숫자는 50 인 반면 M과 K를 각각 보게되면은 가장 적게 만들수있는 숫자는 15이다. 이런식으로 Max 와 Min 기준 문자열을 합쳐서 보냐 따로보냐의 순서로 크기가 달라진다.

여기서 내가 너무나도 화난 부분을 말해보자면은, 이 문제는 정말로 간단하게 제곱 함수를 이용해서 풀수도 있었다. 왜냐면은 10진수이기때문에 제곱 함수를 사용하게 되면 정말로 쉽게 내가 구할려고 하는 숫자가 구해지기 때문이다. 그래서 나 또한 c++에 포함되어있는 pow(x,num) 함수를 이용해서 M과 K의 최대값과 최소값을 구하기 위해서 사용을 했다. 그런데 코드를 제출하자마자 틀렸다고 나왔고 혹시라도 제곱을 하는 과정에서 숫자가 너무 커진게 아닐까 싶어 long long 데이터 타입으로 변환해서도 풀어봤지만 50프로도 못넘기고 바로 탈락했다. 그래서 이건 안되겠다 싶어서 답을 참고했는데 그 누구도 c++로 푼사람이 없었고 파이썬으로 푼 사람의 답을 봤는데 그 사람은 나랑 똑같은 방식으로 풀었지만 파이썬은 제곱을 (10**2) 같이 쓰는걸로 지원해줘서 매우 쉽게 풀었다. 그렇지만 왜 c++은 안되는걸까 하고 너무나도 고민을 하던 와중에 그냥 차라리 원시적인 방법으로 스트링을 하나 하나 만들어주자 해서 밑에처럼 추잡한 방법으로 스트링으로 숫자를 만들어줬다.

그런데 이게 왠일, 바로 통과했다. 이건 뭐 같은 로직을 쓰더라도 c++ 을 사용하는 사람은 맞추지 말고 파이썬 사용하는 사람만 맞아라 하는 테스트케이스도 아니고 정말 문제를 풀면서 열불 났었지만 그래도 문제를 풀었고 꽤 고민을 많이 한 문제였기때문에 벨로그에 올리고싶었다. 그렇지만 나중에는 이런 문제는 안나왔으면 좋겠다 제발.

배운점:
1. greedy 한 생각법
2. 언어의 차이...

profile
성장하는 사람

0개의 댓글