프로그래머스 LV1(6)
2024. 1. 29. 17:21ㆍ백준 및 프로그래머스/프로그래머스 LV 1
-기사단원의 무기
def solution(number, limit, power):
yaksu = [1]
for i in range(2,number+1):
answer = 0
for j in range(1,int(i**(1/2))+1):
if i%j == 0:
answer+=1
if i//j !=j:
answer+=1
yaksu.append(answer)
total = 0
for i in yaksu:
if i <= limit:
total+=i
else:
total+=power
return total
(이 문제는 기본적으로 시간 초과를 유도하는 문제이다.. for 문장을 2번 넣어서 약수를 구하려고 했으나 시간 초과가 나왔고 약수 알고리즘을 찾아 int(i**(1/2)) 알게 되었다. 제곱근을 사용한다면 하나씩 다 넣을 필요가 없는 것이다.)
-소수 만들기
def solution(nums):
count = 0
n = len(nums)
for i in range(n):
for j in range(i+1,n):
for k in range(j+1,n):
total = nums[i] + nums[j] + nums[k]
sosu = 0
for q in range(2,total):
if total % q == 0:
sosu+=1
break
if sosu == 0:
count+=1
return count
-소수 찾기
def solution(n):
count = []
for i in range(2,n+1):
answer = 0
for j in range(1,int(i ** (1/2))+1):
if i % j == 0:
answer+=1
if answer > 1:
break
if answer == 1:
count.append(i)
return len(count)
소수 찾기 알고리즘은 시간초과를 넘어가는 경우가 많아서 까다롭고 어려운것같다..
-덧칠하기
def solution(n, m, section):
count = 1
first = section[0]
for i in section:
if first + (m - 1) < i:
first = i
count+=1
return count
-실패율
def solution(n, stages):
answer = {}
stage_num = len(stages)
for i in range(1,n+1):
if stage_num != 0:
member = stages.count(i)
answer[i] = member / stage_num
stage_num = stage_num - member
else:
answer[i] = 0
answer = sorted(answer,key = lambda x:answer[x],reverse=True)
return answer
-옹알이(2)
def solution(babbling):
answer = 0
for word in babbling:
last = 0
while word:
if word[:2] == "ma" and last!=1:
word = word[2:]
last = 1
elif word[:2] == 'ye' and last!=2:
word = word[2:]
last = 2
elif word[:3] == "woo" and last!=3:
word = word[3:]
last = 3
elif word[:3] == "aya" and last!=4:
word = word[3:]
last = 4
else:
break
if not word:
answer+=1
return answer
-[1차 다트게임]
def solution(dartResult):
answer = 0
dart = []
num =""
for i in dartResult:
if i.isdigit():
num +=i
elif i =='S':
dart.append(int(num)**1)
num =""
elif i =='D':
dart.append(int(num)**2)
num =""
elif i =='T':
dart.append(int(num)**3)
num =""
elif i == '*':
if len(dart) >=2:
dart[-2] = dart[-2] * 2
dart[-1] = dart[-1] * 2
else:
dart[-1] = dart[-1] * 2
elif i =="#":
dart[-1] = dart[-1] *(-1)
return sum(dart)
-로또의 최고 순위와 최저 순위
def solution(lottos, win_nums):
answer = []
tal = lottos.count(0)
cnt = 0
for i in range(len(win_nums)):
for j in range(len(lottos)):
if win_nums[i] == lottos[j]:
cnt+=1
good_rank = tal + cnt
bad_rank = good_rank - tal
if good_rank == 6:
answer.append(1)
elif good_rank == 5:
answer.append(2)
elif good_rank == 4:
answer.append(3)
elif good_rank == 3:
answer.append(4)
elif good_rank == 2:
answer.append(5)
else:
answer.append(6)
if bad_rank == 6:
answer.append(1)
elif bad_rank == 5:
answer.append(2)
elif bad_rank == 4:
answer.append(3)
elif bad_rank == 3:
answer.append(4)
elif bad_rank == 2:
answer.append(5)
else:
answer.append(6)
answer.sort()
return answer
-숫자 짝꿍
def solution(X, Y):
answer = ''
x_num = {n:0 for n in range(10)}
y_num = {n:0 for n in range(10)}
for i in X:
x_num[int(i)]+=1
for i in Y:
y_num[int(i)]+=1
for i in range(9,-1,-1):
answer += str(i) * min(x_num[i], y_num[i])
answer= list(answer)
answer.sort(reverse=True)
if len(answer) == 0:
return "-1"
elif answer[0] == "0":
return"0"
else:
return ''.join(answer)
-대충 만든 자판
def solution(keymap, targets):
answer = []
alpha =dict()
for word in keymap:
for idx,key in enumerate(word):
if key in alpha.keys():
if idx + 1 < alpha[key] :
alpha[key] = idx + 1
else:
alpha[key] = idx+1
for word2 in targets:
total = 0
for target in word2:
if target in alpha:
total += alpha[target]
else:
total = -1
break
answer.append(total)
return answer
(어떻게 풀어야 할 지 잘 몰라서 정답 코드를 살짝 참고하였고, 문제를 이해한 후 다시 나의 방식대로 푼 케이스) 하지만, 정답 코드를 많이 참고해서 제가 풀었다고 하기에는 애매하네영..
-완주 하지 못한 선수
def solution(participant, completion):
answer = ''
name = {name:0 for name in participant}
for i in participant:
if i in name:
name[i]+=1
for j in completion:
if j in name:
name[j]-=1
for i in name:
if name[i]>0:
answer+=i
return answer
-둘만의 암호
def solution(s, skip, index):
word = [i for i in 'abcdefghijklmnopqrstuvwxyz']
answer = ''
for i in s:
word_list = []
tal = 1
while True:
if len(word_list) == index:
break
if word[(word.index(i)+tal)%26] in skip:
tal+=1
else:
word_list.append(word[(word.index(i)+tal)%26])
tal+=1
answer+=word_list[index - 1]
return answer
-[PCCE 기출문제] 9번 / 이웃한 칸
def solution(board, h, w):
dh = [0,1,-1,0]
dw = [1,0,0,-1]
color = board[h][w]
count = 0
for i in range(4):
h_check = h + dh[i]
w_check = w + dw[i]
if 0<=h_check < len(board) and 0<=w_check<len(board):
if board[h_check][w_check] == color:
count+=1
return count
-햄버거 만들기
def solution(ingredient):
answer = 0
hamburger = []
for i in ingredient:
hamburger.append(i)
if hamburger[-4:] == [1,2,3,1]:
answer+=1
for _ in range(4):
hamburger.pop()
return answer
-[PCCE 기출문제] 10번 / 데이터 분석
def solution(data, ext, val_ext, sort_by):
answer = []
if sort_by == 'remain':
data = sorted(data, key = lambda x:x[3])
elif sort_by == 'code':
data = sorted(data, key = lambda x:x[0])
elif sort_by == 'maximum':
data = sorted(data, key = lambda x:x[2])
elif sort_by == 'date':
data = sorted(data, key = lambda x:x[1])
if ext == 'date':
for i in range(len(data)):
if data[i][1] <= val_ext:
answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
if ext == 'code':
for i in range(len(data)):
if data[i][0] <= val_ext:
answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
if ext == 'maximum':
for i in range(len(data)):
if data[i][2] <= val_ext:
answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
if ext == 'remain':
for i in range(len(data)):
if data[i][3] <= val_ext:
answer.append([data[i][0],data[i][1],data[i][2],data[i][3]])
return answer
-바탕화면 정리
def solution(wallpaper):
answer = []
for i in range(len(wallpaper)):
for j in range(len(wallpaper[0])):
if wallpaper[i][j] =='#':
answer.append((i,j))
answer.sort(key = lambda x :(x[0],x[1]))
number = []
min_number = 100000
min_number2 = 100000
for i in range(len(answer)):
if answer[i][0] < min_number:
min_number = answer[i][0]
if answer[i][1] < min_number2:
min_number2 = answer[i][1]
max_number = 0
max_number2 = 0
for i in range(len(answer)):
if answer[i][0] > max_number:
max_number = answer[i][0]
if answer[i][1] > max_number2:
max_number2 = answer[i][1]
number.append(min_number)
number.append(min_number2)
number.append(max_number+1)
number.append(max_number2+1)
return number
-공원 산책
def solution(park, routes):
answer = []
row,col= len(park),len(park[0])
new_col ,new_row = 0,0
new_park = [[ 0 for _ in range(col)] for _ in range(row)]
for i in range(row):
for j in range(col):
if park[i][j] =='X':
new_park[i][j] = 1
elif park[i][j] == 'S':
new_row = i
new_col = j
else:
new_park[i][j] = 0
dx = [0,0,-1,1]
dy = [1,-1,0,0]
for route in routes:
distance, number = route.split()
valid = True
for offset in range(1,int(number)+1):
if distance =='E':
new_row1 = new_row+dx[0] *offset
new_col1 = new_col+dy[0] *offset
elif distance =='W':
new_row1 = new_row+dx[1] *offset
new_col1 = new_col+dy[1] *offset
elif distance =='N':
new_row1 = new_row+dx[2] *offset
new_col1 = new_col+dy[2] *offset
elif distance =='S':
new_row1 = new_row+dx[3] *offset
new_col1 = new_col+dy[3] *offset
if 0<=new_col1<col and 0<=new_row1<row and new_park[new_row1][new_col1] == 0:
pass
else:
valid = False
break
if valid:
new_row = new_row1
new_col = new_col1
return [new_row,new_col]
offset을 이용해서 내가 가려고자 하는 거리까지 저장해주는 것이 포인트라고 생각한다.
-[PCCP 기출문제] 1번/붕대 감기
#t초 동안 붕대를 감으면서 1초마다 x만큼 체력을 회복
#t초 연속으로 붕대를 감는 데 성공하면 y만큼의 체력을 추가회복
def solution(bandage, health, attacks):
n = len(attacks)
count = 0
now_health = health
total = 0
for i in range(n):
time, attack = attacks[i]
while True:
count+=1
total+=1
if count == time:
total = 0
break
else:
if health < now_health:
health+=bandage[1]
if health > now_health:
health = now_health
if total == bandage[0]:
total = 0
health+=bandage[2]
if health> now_health:
health = now_health
health -= attack
if health<=0:
return -1
return health
-문자열 나누기
def solution(s):
answer = 0
while s:
x = s[0]
idx = 0
while idx < len(s):
sub_string = s[0:idx+1]
print(sub_string)
x_count = sub_string.count(x)
if x_count == len(sub_string) - x_count:
break
idx+=1
s = s[idx+1:]
answer+=1
return answer
잘 이해가되지 않아 문제 해결님 유튜브 보면서 문제 해결했습니다. 다시 풀어보고 풀이를 올리도록 하겠습니다.
-[PCCP 기출문제] 1번 / 동영상 재생기
def solution(video_len, pos, op_start, op_end, commands):
answer = ''
#오프닝 함수
def opening(hh,mm,op_start,op_end):
opsm,opsh = map(int,op_start.split(":"))
opem,opeh = map(int,op_end.split(":"))
# 현재 시각이 끝나는 시각 사이일때
if opsm < hh < opem:
return True
elif opsm<=hh<opem:
if opsh<=mm:
return True
elif opsm<hh<=opem:
if mm<=opeh:
return True
elif opsm<=hh<=opem:
if opsh<=mm<=opeh:
return True
return False
def video_time(hh,mm,video_len):
videos,videoe = map(int,video_len.split(":"))
st,se = time(hh,mm,"next")
if st == videos and se > videoe :
return True
return False
def video_time2(hh,mm):
if hh == 0:
if mm - 10 < 0 :
return True
return False
def time(hh,mm,acess):
if acess == "next":
mm += 10
if mm >= 60:
hh+=1
mm-=60
elif acess=='prev':
mm-=10
if mm < 0 :
hh-=1
mm += 60
return [hh,mm]
for acess in commands:
hh,mm = map(int,pos.split(":"))
if opening(hh,mm,op_start,op_end):
hh,mm = map(int,op_end.split(":"))
if acess =="next":
if video_time(hh,mm,video_len):
hh,mm = map(int,video_len.split(":"))
else:
hh,mm = time(hh,mm,acess)
elif acess=="prev":
if video_time2(hh,mm):
hh, mm = 0,0
else:
hh,mm = time(hh,mm,acess)
if opening(hh,mm,op_start,op_end):
hh,mm = map(int,op_end.split(":"))
pos = str(hh) +":"+str(mm)
total = pos.split(":")
total.insert(1,":")
for i in total:
if len(i) == 1 and i !=':':
answer+='0'+i
else:
answer+=i
return answer
- 제] 1번 / 동영상 재생기
'백준 및 프로그래머스 > 프로그래머스 LV 1' 카테고리의 다른 글
| 크레인 인형뽑기 게임 - JAVA (0) | 2025.02.21 |
|---|---|
| 숫자 짝꿍 -JAVA (0) | 2025.02.21 |
| 프로그래머스 LV 1 (0) | 2024.01.28 |
| 프로그래머스 LV 1(5) (0) | 2024.01.26 |
| 프로그래머스 LV1(4) (0) | 2024.01.26 |