#07 럭키 스트레이트
나의 풀이 )
#Chapter12 07
N = input()
mod = int(len(N)/2)
front = N[0:mod]
back = N[mod:len(N)]
sumF = 0
sumB = 0
for a in front :
sumF += int(a)
for b in back :
sumB += int(b)
if sumF == sumB : print('LUCKY')
else : print('READY')
# /와 //의 차이
#print(len(N)//2)
#print(len(N)/2)
#입력 1 123402 --> LUCKY
#입력 2 7755 --> READY
모범 답안)
#Chapter12 07 모범답안
N = input()
length = len(N)
summary = 0
for i in range(length//2) :
summary += int(N[i])
for i in range(length//2, length) :
summary -= int(N[i])
if summary == 0 :
print('LUCKY')
else : print('READY')
#입력 1 123402 --> LUCKY
#입력 2 7755 --> READY
- 나는 슬라이싱 통해 새로운 리스트를 만들어 문제를 풀었고, 모범답안은 for문을 활용해 문자열 인덱스를 통해서 풀었다. 어차피 둘다 for문을 사용하기 때문에 메모리를 조금이라도 아낄 수 있는 모범답안이 더 좋은 풀이같다.
- 연산자 /와 //의 차이를 알 수 있었다. /는 결과값이 실수형이고, //는 정수형이다.
#08 문자열 재정렬
#Chapter12 08
N = input()
eng = []
sum=0
for i in N :
if ord(i) < ord('A') :
sum += int(i)
else :
eng.append(i)
eng.sort()
for i in eng :
print(i, end='')
print(sum)
#입력 1 : K1KA5CB7 -> ABCKK13
#입력 2 : AJKDLSI412K4JSJ9D -> ADDIJJJKKLSS20
#Chapter12 08 모범답안
data = input()
result = []
value = 0
for x in data :
if x.isalpha() :
result.append(x)
else :
value += int(x)
result.sort()
if value != 0 :
result.append(str(value))
print(''.join(result))
1) isalpha()
모든 문자가 알파벳이면 True를 리턴하고, 그렇지 않으면 False를 리턴하는 함수이다. cf. isdigit()은 모든 문자가 숫자인지 확인할 수 있는 함수이다.
2) join()
리스트 원소를 출력할 때 항상 for문을 사용해서 출력했었는데,,, 이렇게 좋은 함수가 있었다.!! iterable한 자료형을 입력값으로 주면 이어붙여서 리턴한다. 만약 원소 사이에 공백을 주고 싶다면 아래와 같이 사용하면 된다.
print(' '.join(result))
# A B C K K 13
#09 문자열 압축
#Chapter12 09
def solution(s):
res = len(s)
count = 1
length = len(s)//2 #3
#newStr = dict()
for i in range(1,length+1) :
num = len(s)//i # 24//6 = 4
news = ''
for j in range(num) :
start = i*j #6*0 = 4
fin = i*(j+1) #2*3 = 6
nxt = i*(j+2) #2*4 = 8
if s[start:fin] == s[fin:nxt] :
count +=1
else :
if count == 1 :
news = news + s[start:fin]
else :
news = news + str(count) + s[start:fin]
count = 1
if j == num-1 :
news += s[fin:len(s)]
if len(news) < res :
res = len(news)
print(res)
answer = res
return answer
모범답안 )
# 모범답안
#https://programmers.co.kr/learn/courses/30/lessons/60057
def solution(s) :
answer = len(s)
for step in range(1, len(s)//2+1) :
news = ''
prev = [0:step]
count = 1
for j in range(step, len(s), step) :
if prev == s[j:j+step] :
count +=1
else :
news += str(count) + prev if count >= 2 else prev
prev = s[j:j+step]
count=1
news += str(count) + prev if count >= 2 else prev
answer = min(answer, len(news))
return answer
1) range 함수의 재발견
: 나는 항상 시작, 끝 값만 가지고 +1씩 증가시키는 용도로만 사용했었는데, 증가 범위를 지정할 수도 있었다. 심지어 감소까지 가능하다. step을 사용하니 한층 간결하게 소스를 작성할 수 있었다. 무엇보다 step씩 증가(또는 감소)하다가 stop 범위를 넘으면 알아서 멈춘다니..신기하다!
- 사용예시)
for i in range(2,8,3) :
print(i)
# 2, 5
2) 슬라이싱
- 배열에서는 인덱스가 배열 크기를 넘어가면 에러가 나지만 문자열 슬라이싱은 인덱스가 초과하면 가장 끝 값으로 리턴한다.(당연히 인덱스를 지켜줘야하는 줄 알고 열심히 나누기하면서 계산했는데..)
s = 'love'
print(s[1:10])
# ove
3) if else문 간결화
# 내 답안
if count == 1 :
news = news + s[start:fin]
else :
news = news + str(count) + s[start:fin]
#모범 답안
news += str(count) + prev if count >= 2 else prev
4) 최솟값 구하기
# 내 답안
if len(news) < res :
res = len(news)
# 모범 답안
answer = min(answer, len(news))
5) 이전값과 이후값이 같으면 굳이 이전값을 바꿔줄 필요가 없기 때문에 초기값을 for문 밖에 세팅해두고 이전값과 이후값이 달라질 때만 바꿔주는 방식으로 문제를 풀어도 된다.
'Algorithm' 카테고리의 다른 글
30th. CodeUp #1057 : [기초-논리연산] 참/거짓이 서로 같을 때에만 참 출력하기 (0) | 2020.12.14 |
---|---|
29th. CodeUp #1506 : [기초-논리연산] 참/거짓이 서로 다를 때에만 참 출력하기 (0) | 2020.12.14 |
이것이 코딩테스트다 Chapter 4 구현 (0) | 2020.12.05 |
CodeUp 기초100제 [기초-데이터형] 문제풀이 (#1028~#1030) (0) | 2020.11.25 |
CodeUp 기초100제 [기초-출력] 문제 풀이(#1001~#1008) (0) | 2020.11.25 |