일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- heapq
- 이분탐색
- KAKAO BLIND RECRUITMENT
- divmod
- Zip
- programmers
- 수학
- Combinations
- 추석맞이 코딩챌린지
- backjoon
- 재귀함수
- Re
- lambda
- 프로그래머스
- dfs
- 정렬
- BFS
- 정규식
- 자바
- 동적 계획법
- Set
- java
- DateTime
- 백준
- 그리디
- python
- 파이썬
- 위클리 챌린지
- 다익스트라
- 카카오
Archives
- Today
- Total
상상쓰
[프로그래머스] 110 옮기기 본문
https://programmers.co.kr/learn/courses/30/lessons/77886
시간초과 또는 예외사항으로 시간이 조금 걸렸다.
아이디어는 '110' 을 한 번에 다 뽑은 후, 재배열하는 것이다.
우선 먼저 뽑은 '110' 은 사전 순이므로 '11' 앞으로 위치하거나, '0' 뒤로 위치하기 때문에 다음에 만들어지는 '110' 에 영향을 주지 않는다. 그렇기 때문에 이 방법이 가능하다.
'110' 을 다 뽑은 배열을 array 라고 하자. array 는 '110' 을 다 뽑았기 때문에 '1' 이 연속으로 두 개 이상 오는 경우는 '1' 이 연속적으로 오면서 '1' 로 배열이 끝나야 한다. 즉, '110' 은 array의 마지막 원소부터 역으로 '0'이 나타날 때 그 위치에 '110' 을 뽑은 개수만큼 나열해주면 사전 순으로 배열이 만들어진다. array 의 길이가 0 이거나, '0' 이 나타나지 않으면 가장 처음에 '110' 을 뽑은 개수만큼 나열하면 된다.
def solution(s):
answer = []
for i in s:
array = []
cnt = 0
for j in i:
if j == '0':
if array[-2:] == ['1', '1']:
cnt = cnt + 1
array.pop()
array.pop()
else:
array.append(j)
else:
array.append(j)
if len(array) == 0:
answer.append('110' * cnt)
else:
for j in range(len(array)-1, -1, -1):
if array[j] == '0':
array[j] = '0' + ('110' * cnt)
break
if j == 0:
array[j] = ('110' * cnt) + '1'
answer.append(''.join(array))
return answer
print(solution(['1110','100111100','0111111010'])) # ['1101','100110110','0110110111']
'Coding Test' 카테고리의 다른 글
[프로그래머스] 모두 0으로 만들기 (0) | 2021.05.27 |
---|---|
[프로그래머스] 약수의 개수와 덧셈 (0) | 2021.05.26 |
[프로그래머스] 2개 이하로 다른 비트 (0) | 2021.05.25 |
[프로그래머스] 순위 검색 (0) | 2021.05.25 |
[프로그래머스] 정수 삼각형 (0) | 2021.05.21 |
Comments