본문 바로가기
코딩/백준

알고리즘/숏코딩 - Python / 백준 - 2154번 : 수 이어 쓰기 3

반응형

2154번: 수 이어 쓰기 3 (acmicpc.net)

 

2154번: 수 이어 쓰기 3

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다.

www.acmicpc.net

 


풀이

  • 1부터 100,000까지의 수를 이어 붙이고 그 문자열 중에서 특정 숫자가 몇 번째에 나오는지 찾는 문제이다.
  • 파이썬이 find() 나 index()를 통해 문자열에서 특정 문자의 위치를 찾는 것이 편하므로 코드가 짧을 것 같아 숏코딩에 도전하였다.
  • 처음 든 생각은 for문으로 1부터 100,000까지 모든 수를 문자열에 이어 붙이고 그 문자열에서 find를 사용하는 것이었다.
  • 위의 방법은 65B 로 숏코딩 1등을 위해서는 더 짧아야 했다.
  • 두 번째로는 어차피 n의 범위가 100,000 까지 이므로 for문 안에서 100,000이라는 수의 길이를 줄여보려 하였다.
  • 100,000 = (10**5)+1 이고 11**5가 100,000의 범위를 포함하므로 for문에서의 100,000을 11**5로 바꾸는 것으로 코드를 더 줄여보았다.
  • 세 번째로는 문자열 자체를 만드는 부분에서 코드를 줄여야겠다고 생각해 문자열 합치기에 자주 사용되는 join 함수를 사용해보았다.
  • 위의 아이디어를 종합하여 총 코드 길이 55B로 숏코딩 1등을 달성하였다.

 

#숏코딩-파이썬
#백준 2154번 - 수 이어 쓰기 3

#1번 코드 - 길이 : 65B
#for문으로 1 부터 100,001 까지 모든 수를 문자열에 이어 붙이고 그 문자열에서 find를 사용하기
a=""
for i in range(1,100001): a+=str(i)
print(a.find(input())+1)

#2번 코드 - 길이 : 64B
#11**5가 100,000의 범위를 포함하므로 for문에서의 100,000 을 11**5로 바꾸는 것
a=""
for i in range(1,11**5): a+=str(i)
print(a.find(input())+1)

#3번 코드 - 길이 : 55B
#문자열 생성 부분의 코드를 줄이기 위해 join함수 사용
print(''.join(map(str,range(1,11**5))).find(input())+1)

 

 

 

 

 

반응형