본문 바로가기
Problem Solving/BOJ

[BOJ][Python]1515 풀이

by NoiB 2023. 7. 14.
반응형

https://www.acmicpc.net/problem/1515

 

1515번: 수 이어 쓰기

세준이는 1부터 N까지 모든 수를 차례대로 공백없이 한 줄에 다 썼다. 그리고 나서, 세준이가 저녁을 먹으러 나간 사이에 다솜이는 세준이가 쓴 수에서 마음에 드는 몇 개의 숫자를 지웠다. 세준

www.acmicpc.net

line = input()
ans = 0
while len(line):
    ans += 1
    check = str(ans)
    while len(check) > 0 and len(line) > 0:
        if check[0] == line[0]:
            line = line[1:]
        check = check[1:]
print(ans)

구현 문제는 항상 표기 난이도보다 좀 어려운 것 같습니다. 아이디어는 떠오르는데 그걸 코드로 옮기질 못하는 것 같아요. 정해진 시간안에 코드를 완성하지 못해서 여러 블로그의 풀이를 살펴봤는데 구현 문제라 그런지 접근방법이 신기한 분들도 많이 있었습니다. 그 중에서 제가 생각했던 아이디어를 코드로 작성하신 분이 있어서 도움을 받을 수 있었기에 해당 블로그의 링크를 첨부합니다. https://latte-is-horse.tistory.com/373

 

코드에 대한 설명을 해보자면,

1. 입력을 받는다

2. 정답 변수 ans를 초기화한다.

3. line의 길이가 0이 아닐 때만 작동하는 반복문을 작성한다.

4. ans의 크기를 하나씩 키워가면서 최솟값을 체크한다.

5. line과 비교할 변수 check를 선언한다.

6. check와 line의 길이가 둘 다 0이 아닐 때 작동하는 반복문을 작성한다.

7. check의 첫번째 문자와 line의 첫번째 문자가 같으면 슬라이싱을 통해 결과적으로 line의 첫번째 문자를 지운다.

8. 조건문과 관계없이 check의 첫번째 문자를 지운다.

9. ans를 출력한다.

 

아마 저와 같은 아이디어를 떠올렸던 분이라면 코드를 보자마자 아하 하셨을 것 같은데요. 숫자를 키워가면서 입력과 비교하면 되지 않을까라는 생각에서 제가 해결하기 어려웠던 부분은 입력에 있는 숫자가 어떤 숫자가 지워진 상태의 숫자인지 모르는채로 1씩 올려가는 check와 비교를 해서 지우고 말고를 결정하지? 였습니다. 막 혼자서 check의 길이까지만 line을 슬라이싱 해서 비교를 해볼까도 생각해보고 line의 첫문자에 뭘 더 붙여가면서 비교를 할까 등등 여러가지 방법을 생각해봤는데 좀처럼 일반화가 되지 않더라구요. 뭔가 in 메서드와 비슷한 과정을 보이면서도 단순하게 in만 사용했을 때 생길 수 있는 문제도 반복문을 하나 더 사용하면서 해결이 되었구요. 정말 단순한 듯 하면서 내공이 느껴지는 그런 방법이었습니다.

 

최근에는 오래 쉬다가 알고리즘 문제를 다시 풀기 시작하면서 재활 훈련을 하는 느낌으로 계속 실버 3 문제만 풀고 있었는데, 어제부터 도전중인 루비1 문제가 있습니다. 논문을 뒤져보든 쌩으로 구현을 하든 어떻게 해서든지 풀겠다 하는 마음으로 하고 있는데 빨리 성공해서 포스팅을 해보고 싶네요(다만 다이아 티어 정도만 되어도 인터넷에서 문제 풀이를 찾기 힘든걸 보면 일정 티어 이상에서는 풀이를 올리지 않는 불문율 같은게 있는지도 모르겠습니다).

 

 

 

 

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python] 1138 풀이  (0) 2023.07.16
[BOJ][Python]1569 풀이  (0) 2023.07.15
[BOJ][Python]13305 풀이  (0) 2023.07.13
[BOJ][Python]1904 풀이  (0) 2023.07.11