일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Set
- 자바
- BFS
- 카카오
- 파이썬
- 백준
- KAKAO BLIND RECRUITMENT
- 정규식
- 다익스트라
- 정렬
- 동적 계획법
- lambda
- 추석맞이 코딩챌린지
- 수학
- 프로그래머스
- Re
- 이분탐색
- python
- DateTime
- java
- 그리디
- dfs
- Combinations
- Zip
- 재귀함수
- backjoon
- programmers
- divmod
- 위클리 챌린지
- heapq
Archives
- Today
- Total
상상쓰
[프로그래머스] 110 옮기기 본문
https://programmers.co.kr/learn/courses/30/lessons/77886
코딩테스트 연습 - 110 옮기기
0과 1로 이루어진 어떤 문자열 x에 대해서, 당신은 다음과 같은 행동을 통해 x를 최대한 사전 순으로 앞에 오도록 만들고자 합니다. x에 있는 "110"을 뽑아서, 임의의 위치에 다시 삽입합니다. 예를
programmers.co.kr
시간초과 또는 예외사항으로 시간이 조금 걸렸다.
아이디어는 '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