Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 스프링 웹플럭스
- Meta Table
- spring webflux
- ChainedTransactionManager #분산데이터베이스 #Spring Boot #MyBatis
- 날짜형을 문자형으로
- 스테이지에 올리기
- 무시하기
- git stage
- 폐기하기
- org.json
- 마리아디비
- 스프링 배치 메타 테이블
- date_format
- jar 소스보기
- batchInsert
- JSON 분할
- JSON 분해
- 성능개선
- 스프링 배치 공식문서
- JobExecutionAlreadyRunningException
- spring reactive programming
- str_to_date
- JSONArray 분할
- 문자형을 날짜형으로
- 마이바티스 트랜잭션
- 스프링 리액티브 프로그래밍
- JSON 분리
- multi update
- JSONObject 분할
- nonblocking
Archives
- Today
- Total
ebson
boj.kr/1339 단어 수학 (gold4) 파이썬 풀이 본문
오답풀이
- 제시된 4개 테스트 케이스는 통과했으나 제출시 틀린 케이스가 있었다.
N = int(input())
words = [input() for _ in range(N)]
words = sorted(words, key=lambda x: len(str(x)), reverse=True)
matches = [0 for _ in range(10)]
pointers = []
import heapq
for i in range(len(words)):
heapq.heappush(pointers, (-len(words[i]), i, -len(words[i])))
mIdx = 9
while mIdx >= 0:
(pointer, wIdx, len) = heapq.heappop(pointers)
(pointer, wIdx, len) = (-pointer, wIdx, -len)
if words[wIdx][len-pointer] in matches:
pointer -= 1
heapq.heappush(pointers, (-pointer, wIdx, -len))
else:
matches[mIdx] = words[wIdx][len-pointer]
pointer -= 1
heapq.heappush(pointers, (-pointer, wIdx, -len))
mIdx = mIdx - 1
tot = 0
for item in pointers:
tot += item[0]
if tot == 0:
break
numbers = [0]
for word in words:
for c in word:
word = word.replace(str(c), str(matches.index(c)))
numbers.append(int(word))
print(sum(numbers))
정답풀이
- 단어의 각 문자를 숫자로 바꾸는 경우 자릿수가 가장 큰 것에 우선적으로 큰 수를 부여한다.
- 그 문자가 정확히 무엇이엇는지 기억하는 것이 아니라 총합이 최댓값이 되도록 하는 것이 목표이다. (각 문자는 인덱스로 구분만 되면 되고, 각 문자의 자릿수를 정확히 알고 계산해야 한다.)
- enumerate를 사용해 리스트를 순회하면 인덱스와 값을 동시에 얻을 수 있다. (마지막 인덱스부터 순회하면 각 문자의 자리수를 얻을 수 있다.)
- 가장 큰 자리수로 저장된 문자부터 큰 수를 부여해 총합을 계산한다.
1. 각 문자열을 각 문자별로 0-25의 정수로 치환
2. 알파벳 배열을 26개의 0으로 초기화
3. 각 문자열을 뒤집어 enumerate 으로 인덱스와 문자를 정수로 변환한 값(i, c)을 조회하고 순회시마다 아래를 반복
3.1. 알파벳 배열[c] 값에 i**10을 더하기
4. 알파벳 배열을 내림차순으로 정렬
5. 알파벳 배열의 0번 요소부터 8번 요소까지 9부터 1까지 정수를 큰수부터 차례대로 각각 곱한 값을 누적
6. 누적합을 출력
N = int(input())
words = []
for _ in range(N):
words.append(list(map(lambda c: ord(c)-65, input())))
alphabets = [0] * 26
for word in words:
for i, c in enumerate(word[::-1]):
alphabets[c] += 10 ** i
alphabets.sort(reverse=True)
n = 9
tot = 0
for i in range(9):
tot += n*alphabets[i]
n -= 1
print(tot)
ord(문자) 함수를 사용하면 해당하는 아스키코드 정수값을 얻을 수 있다.
문자열을 [::-1] 의 인덱스로 조회하면 뒤집힌 문자열의 결과를 얻을 수 있다.
'ALGORITHM STUDY WITH PYTHON > Greedy' 카테고리의 다른 글
boj.kr/1744 수 묶기 (gold4) 파이썬 풀이 (0) | 2023.05.14 |
---|---|
boj.kr/1202 보석 도둑 (gold2) 파이썬 풀이 (0) | 2023.05.11 |
boj.kr/1946 신입사원 (silver1) 파이썬 풀이 (0) | 2023.05.08 |
boj.kr/1715 카드 정렬하기 (gold4) 파이썬 풀이 (0) | 2023.05.08 |
boj.kr/1931 회의실 배정 (silver1) 파이썬 풀이 (0) | 2023.05.08 |
Comments