from collections import Counter
list666 = [str(i)+'666' for i in range(10000)]
addtemp = []
for _ in list666: #모든 리스트의 수에 대해
count6 = Counter(_) # counter로 각 6의 갯수를 찾음
if int(count6['6'])>= 3 & ('666' in _)==True: #6의 갯수가 666인 3개보다 많다면
temlist= _.split('666',1)#666기준으로 앞 뒤로 나눠 리스트 생성
if(temlist[1] != ''):
addcount = 10 **(len(temlist[1]))
for i in range(addcount):
addtemp.append(''.join(temlist[0])+'666'+str(i).zfill(len(temlist[1])))
list666.extend(addtemp)
list666 = list(set(map(int,list666)))
list666 = sorted(list666)
n = int(input()) -1
print(list666[n])
풀이
수 안에 무조건 666이 들어가야 한다는 조건을 이용해 str(i)+'666' for i in range(10000) 를 사용. n이 최대 10000인 조건을 이용.
6666 처럼 666+a 만큼의 6이 붙어있는 수의 경우를 처리하기 위해서 666을 기준으로 split하여 [1]인덱스에 6이 존재한다면 결국 내가 수를 임의로 넣을 수 있는 자릿수가 6의 갯수만큼 존재하는 것이기 때문에 한 칸에 들어갈수 있는 숫자의 개수:0~9까지 10개 ** 6의 갯수(문자열 길이)로 모든 경우의수를 대조하였고 split을 통해 분열한 리스트의 [1]에 6이 존재하지 않을 때를 제외하고 작동하게 했다.
그래서 추가된 수를 addtemp에 저장한 후 set과 map(int)를 이용해 중복되는 수를 삭제하고 문자열을 정수 형태로 변경해주었다. 정수로 변경된 상태에서 sorted를 통해 오름차순 정렬 후 원하는 값을 출력하도록 하였다.
후기
여태 C언어로만 문제를 풀다가 동아리에 가입하고 파이썬으로 급하게 언어를 전환하려니 매우 힘들었다. Wikidocs.net 에 있는 기초 강의를 슥 훑어보며 작년 1학기의 파이썬 기초 수업의 내용을 되살려보았지만 알고리즘 문제를 풀 때 생각보다 큰 도움이 되지 않아 C언어를 공부한 경험을 발판삼아 파이썬 또한 언어가 작동되는 기초적인 원리부터 심화적으로 공부하기 시작했다. 그렇게 공부하며 새로 배운 부분들이 많았는데 클래스가 없는 C언어와는 달리 파이썬은 클래스가 존재하며, 메모리 데이터 값은 객체 형태로 저장된다는 것을 알았고 그 객체를 바인딩하는 변수가 존재하지 않게 되었을 때 가비지 컬렉션에 의해 자동으로 소멸되는 것도 알게 되었다. 메모리 누수를 직접적으로 관리하는 c와는 매우 달라 흥미로웠다. 또 클래스의 개념을 이해할 때 c언어에서 typedef 내장 함수를 활용해 구조체를 생성하는 원리에 대한 개념을 착안하여 이해하려고 시도하니 생각보다 쉽게 받아드릴 수 있었다.
C언어를 잘은 못해도 어느정도는 다룰 수 있다고 생각했던 본인은 알고리즘 문제를 풀 때 논리 자체가 쉽든 어렵든 C언어의 컴파일 오류에 매우 시달리고 있었다. 특히 복잡한 포인터를 사용하거나 동적 할당을 이용할 때 매우 헷갈렸었고 컴파일 환경마다 작동되는 문법이 다른 것도 스트레스의 주범이었다.
이번에 처음 python으로 문제를 풀 때는 아직 문법적인 지식이 매우 부족하기때문에 내가 생각하는 논리를 코드로 풀어나가기 위해서 문법 하나하나 구글링하며 몸으로 부딪히면서 배워갔다. 과정에서 느낀점은 c언어에 비해 미치도록 편리하다는 부분이었다. 보통 C에서 직접 구현해야하는 함수가 내장 함수로 있는 경우도 많았고 리스트 컴프리핸션은 신세계 그 자체였다. 아직까지 복잡한 문법을 사용하지 않아서 그런지는 모르겠지만 컴파일 시 발생하는 오류 자체도 현저히 줄었다. 아마 C언어만큼 문법에 익숙해지게 된다면 풀이시간이 굉장히 단축되지 않을 까 싶다.
'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
BOJ 9252(python) : LCS 2 (1) | 2022.01.20 |
---|---|
[BOJ / C++] 15649번 - N과 M (1) (0) | 2022.01.17 |
[BOJ / Python] 10819 - 차이를 최대로 (0) | 2022.01.16 |
[백준/C++]알고리즘 1051번 숫자 정사각형 (0) | 2022.01.15 |
[BOJ / C++] 1018 : 체스판 다시 칠하기 (0) | 2022.01.15 |