programmers level1 문제 푼거 정리
programmers level1 문제 푼거 정리
숫자 문자열과 영단어
def solution(s):
s = s.replace("zero", "0")
s = s.replace("one", "1")
s = s.replace("two", "2")
s = s.replace("three", "3")
s = s.replace("four", "4")
s = s.replace("five", "5")
s = s.replace("six", "6")
s = s.replace("seven", "7")
s = s.replace("eight", "8")
s = s.replace("nine", "9")
answer = int(s)
return answer
다른 사람 답 딕셔너리로 더 가독성 좋고 짧게 처리함.
키패드 누르기
내답 python
number_coord = {1: [0, 0], 2: [1, 0], 3: [2, 0], 4: [0, 1], 5: [1, 1], 6: [2, 1], 7: [0, 2], 8: [1, 2], 9: [2, 2], 0: [1, 3]}
def solution(numbers, hand):
right_hand_coord = [2, 3]
left_hand_coord = [0, 3]
answer = ''
for i in range(len(numbers)):
if numbers[i] == 1 or numbers[i] == 4 or numbers[i] == 7:
answer += "L"
left_hand_coord = number_coord[numbers[i]]
elif numbers[i] == 3 or numbers[i] == 6 or numbers[i] == 9:
answer += "R"
right_hand_coord = number_coord[numbers[i]]
elif numbers[i] == 2 or numbers[i] == 5 or numbers[i] == 8 or numbers[i] == 0:
right_distance = abs(right_hand_coord[0]-number_coord[numbers[i]][0])+abs(
right_hand_coord[1]-number_coord[numbers[i]][1])
left_distance = abs(left_hand_coord[0]-number_coord[numbers[i]][0])+abs(
left_hand_coord[1]-number_coord[numbers[i]][1])
if right_distance < left_distance:
answer += "R"
right_hand_coord = number_coord[numbers[i]]
elif right_distance > left_distance:
answer += "L"
left_hand_coord = number_coord[numbers[i]]
elif right_distance == left_distance:
if hand == "right":
answer += "R"
right_hand_coord = number_coord[numbers[i]]
elif hand == "left":
answer += "L"
left_hand_coord = number_coord[numbers[i]]
return answer
다른 사람 답 비슷한데 for i in numbers랑 변수 명이 훨 깔끔
크레인 인형 뽑기
def solution(board, moves):
answer = 0
stack = []
for i in moves:
move = i-1
for row in range(len(board)):
if board[row][move] != 0:
stack.append(board[row][move])
board[row][move] = 0
if len(stack) >= 2:
if stack[-1] == stack[-2]:
stack.pop()
stack.pop()
answer += 2
break
return answer
다른 사람꺼 봤는데 나랑 비슷함
음양더하기
def solution(absolutes, signs):
answer = 0
for i in range(len(absolutes)):
if signs[i]:
answer += absolutes[i]
else:
answer -= absolutes[i]
return answer
??? 쉬웠음 근데 다른 사람 푼거보고 충격
def solution(absolutes, signs):
return sum(absolutes if sign else -absolutes for absolutes, sign in zip(absolutes, signs))
없는 숫자 더하기
내답
def solution(numbers):
answer = 0
for i in range(10):
if i not in numbers:
answer += i
return answer
def solution(numbers):
return 45 - sum(numbers)
오 아이디어
약수의 갯수와 덧셈
내답
sqrt_num_list = []
for i in range(1, 100):
sqrt_num_list.append(i**2)
def solution(left, right):
answer = 0
for num in range(left, right+1):
if num in sqrt_num_list:
answer -= num
else:
answer += num
return answer
남의답 제곱수를 구하는데 나는 리스트를 만들었고 이 답은 **0.5를 했다는 것이 인상적 그부분만 빼면 똑같은
js 도 math가 있구나 나중에 함다시 봐야지
신규 아이디 추천
내 풀이
조건 좀 많긴한데 엄청 쉬운거 같아서 대충 짰다가 조건마다 조금씩 빠트리거나 실수한 부분때문에 오래 걸렸다
alphabet = "abcdefghijklmnopqrstuvwxyz"
number = "1234567890"
def solution(new_id):
answer = new_id
answer = answer.lower() # 1
print("1--"+answer)
current_pointer = 0 # 2
while current_pointer != len(answer):
if answer[current_pointer] not in alphabet+number+"-" + "_" + ".":
answer = answer[:current_pointer]+answer[current_pointer+1:]
current_pointer -= 1
current_pointer += 1
print("2--"+answer)
while ".." in answer:
answer = answer.replace("..", ".") # 3
print("3--"+answer)
if len(answer) != 0:
if answer[0] == ".": # 4
answer = answer[1:]
if len(answer) != 0:
if answer[-1] == ".":
answer = answer[:-1]
print("4--"+answer)
if len(answer) == 0: # 5
answer = "a"
print("5--"+answer)
if len(answer) >= 16: # 6
answer = answer[:15]
while answer[-1] == ".":
if len(answer) <= 1:
answer = ""
break
answer = answer[:-1]
print("6--"+answer)
if len(answer) <= 2: # 7
while len(answer) < 3:
answer += answer[-1]
print("7--"+answer)
return answer
다른 사람 풀이: 정규식 나도 정규식 익혀야겠다 패키지 re를 사용
js 다른사람 여기도 정규식 replace 사용
내적
엄청 쉬웠음 근데 보자마자 다른사람들이 괴물같이 풀어놨을걸 직감해서 고민 좀 해보다가 그냥 길게 풀음
def solution(a, b):
answer = 0
for i in range(len(a)):
answer += a[i]*b[i]
return answer
다른 사람 답 zip 람다 사용
완주하지 못한 선수
쉬운데? 하면서 풀었지만 효율성 검사에서 걸림
def solution(participant, completion):
for complete_name in completion:
participant.remove(complete_name)
answer = participant[0]
return answer
remove 같은게 o(n)이라 많이 걸리나봄 그래서 일단 sort를 해봤는데 실패
def solution(participant, completion):
participant.sort()
completion.sort()
for complete_name in completion:
participant.remove(complete_name)
answer = participant[0]
return answer
누가 해쉬테이블을 만들라는 힌트를 써놔서 그대로 했더니 해결
def solution(participant, completion):
participant_dict = {}
for i in range(len(participant)):
if participant[i] in participant_dict:
participant_dict[participant[i]] += 1
else:
participant_dict[participant[i]] = 1
for complete_name in completion:
participant_dict[complete_name] -= 1
for i in participant:
if participant_dict[i] != 0:
answer = i
return answer
다른 사람 답 collection 모듈 해쉬로 사용
또 다른 사람 답 우와 이건 해시 함수 사용. 해시라는 내장 함수가 있나?
js 숏코딩 이건 너무하네 underscore 라이브러리라고 한다
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
신고 결과 받기
문제를 꼼꼼히 읽자 문제를 잘못읽어서 여러번 다시 읽고 고침 신고를 하는 사람 신고를 받는사람 이런 경우에 변수명을 뭐라 해야 할지가 고민 reporter reported 이런식으로 했는데 구분이 잘 안간다.
def solution(id_list, report, k):
reporter_dict = {}
reported_dict = {}
answer = []
stop_id = set()
for i in id_list:
reported_dict[i] = set()
reporter_dict[i] = set()
for i in report:
reporter_id, reported_id = i.split(" ")
reported_dict[reported_id].add(reporter_id)
reporter_dict[reporter_id].add(reported_id)
for i in id_list:
if len(reported_dict[i]) >= k:
stop_id.add(i)
for i in id_list:
answer.append(len(reporter_dict[i] & stop_id))
return answer
직사각형 별찍기
a, b = map(int, input().strip().split(' '))
for i in range(b):
print("*" * a)
헐 나랑 같은데 _를 i 대신 쓰네 i를 내부에서 다시 안 쓴다는 뜻인가? 좋은거같다 좀더 찾아보고 나도 써야지
행렬의 덧셈
쉬움 그렇지만 조금 버벅댐
내코드
def solution(arr1, arr2):
answer = []
for i in range(len(arr1)):
answer.append([])
for j in range(len(arr1[0])):
answer[i].append(arr1[i][j]+arr2[i][j])
return answer
아 넘파이 쓰기도 써도 되나 나도 이거 아는데 좀 까먹음 다시 정리하면 좋을지도 라고 생각했지만 넘파이는 쓰면 안된다고 한다
x만큼 간격이 있는 n개의 숫자
def solution(x, n):
answer = []
temp = x
while n != 0:
answer.append(temp)
temp += x
n -= 1
return answer
다른 사람 답
[i * x + x for i in range(n)] 요런 구문도 있네
k번째수
내답 쉬운편. 원래 입력값은 가급적이면 변하지 않게 하는 것이 좋겠다. 나중에 착각할라
def solution(array, commands):
answer = []
for command in commands:
temp = array[command[0]-1:command[1]]
temp.sort()
answer.append(temp[command[2]-1])
return answer
다른 사람의 답 역시나 람다로 숏코딩
다른 사람 js map이랑 필터 사용
하샤드 수
쉬움 근데 파이썬에서 string이 str로 나타낸다는 것을 깨달음. 그리고 str도 이터러블 하다는 것을 알았다. 그냥 해봤는데 되더라
def solution(x):
answer = False
str_x = str(x)
div_num = 0
for i in str_x:
div_num += int(i)
if x % div_num == 0:
answer = True
return answer
다른 사람 코드 아 sum으로 리스트 요소를 더할 수 있구나
3진법 뒤집기
진법 계산하는 법이 기억이 잘 안나서 더듬더듬함. 이런거 나오면 연필로 풀어보고 하는 것이 좋을 것 같다.
내 코드
def solution(n):
temp = n
three = []
answer = 0
while temp != 0:
three.append(temp % 3)
temp = int(temp/3)
three.reverse()
for i in range(len(three)):
answer += 3**i*three[i]
return answer
다른 사람 답
헐 int에 이런게 있었구나
int(tmp, 3) 로 tmp 스트링을 삼진법으로 읽어서 자연수로 만들어준다
js에도 이 기능이 있네 tostring(3) 이렇게 쓴다
모의고사
와 이렇게 길게 짜도 괜찮나 싶었지만 뭔가 딱히 다른 생각이 안났다.
first_supo = [1, 2, 3, 4, 5]
second_supo = [2, 1, 2, 3, 2, 4, 2, 5]
third_supo = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
def solution(answers):
first_supo_answer = first_supo * \
int(len(answers)/5)+first_supo[:int(len(answers) % 5)]
second_supo_answer = second_supo * \
int(len(answers)/8)+second_supo[:int(len(answers) % 8)]
third_supo_answer = third_supo * \
int(len(answers)/10)+third_supo[:int(len(answers) % 10)]
points = [0, 0, 0]
answer = []
for i in range(len(answers)):
if first_supo_answer[i] == answers[i]:
points[0] += 1
if second_supo_answer[i] == answers[i]:
points[1] += 1
if third_supo_answer[i] == answers[i]:
points[2] += 1
for i in range(len(points)):
if max(points) == points[i]:
answer.append(i+1)
return answer
다른사람 답 아근데 비슷한데 나머지로 바로 구할 수 있었구나
js 다른사람 방식은 비슷하네 filter랑 math랑 max 사용
짝수와 홀수
너무 쉬워서 할말 없음
def solution(num):
if num%2==1:
answer="Odd"
else:
answer="Even"
return answer
남의코드 : 그렇지만 다른사람들은 더짧게 풀음
이해가 안되서 일단 남겨둠
def evenOrOdd(num):
return ["Even", "Odd"][num & 1]
체육복
deep copy와 shallow copy의 차이점을 잘 알아 두어야겠다
원래 이런식으로 했었는데
lost_temp = lost
reserve_temp = reserve
print("lost", lost) #둘이 같은거 나옴
print("lost_temp", lost_temp)
복사본을 remove를 하면 원본도 훼손됨을 확인 내 답. 많이 헤멨다. deep shallow copy 알고 있었는데 기억이 잘 안났음.. 영 모르겠으면 그냥 질문 게시판을 보자 그리고 sort는 따로 정렬이 안되어있을 수 있다는 소리가 없었는데 해야했다. 당연히 정렬되어있다는 언급 없으면 정렬이 안되어 있을 수도 있는 것이다.
def solution(n, lost, reserve):
lost.sort()
reserve.sort()
lost_temp = []
reserve_temp = []
for i in range(len(lost)):
lost_temp.append(lost[i])
for i in range(len(reserve)):
reserve_temp.append(reserve[i])
answer = n
for i in lost:
if i in reserve_temp:
reserve_temp.remove(i)
lost_temp.remove(i)
for i in lost_temp:
if i-1 in reserve_temp:
reserve_temp.remove(i-1)
elif i+1 in reserve_temp:
reserve_temp.remove(i+1)
else:
answer -= 1
return answer
남의 코드 발상이나 흐름은 비슷하지만 훨씬 정리되고 깔끔하다 근데 옛날코드라 안 정렬을 안함
핸드폰 번호 가리기
엄청 쉬움 난이도 편차가 왜이렇게 있는 편이지
def solution(phone_number):
answer="*"*len(phone_number[:-4])+phone_number[-4:]
return answer
오 남의것도 내꺼랑 비슷함 js 구경 정규식은 외계어 같네
// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
function hide_numbers(s) {
return s.replace(/\d(?=\d{4})/g, "*");
}
// 아래는 테스트로 출력해 보기 위한 코드입니다.
console.log("결과 : " + hide_numbers('01033334444'));
js repeat나 slice 나 다 모르는 함수다… 여기는 len 이 아니라 length구나 이것도 상기시켜 준다.
js 와이건 외계어 같다
const solution = n => [...n].fill("*",0,n.length-4).join("")
평균 구하기
쉬워서 할말 없음
def solution(arr):
answer = sum(arr)/len(arr)
return answer
콜라츠 추측
쉬움. 근데 제발 문제 좀 끝까지 읽어…
def solution(num):
answer = 0
while num!=1:
if answer>500:
answer=-1
break
if num%2==0:
num=num/2
answer+=1
else:
num=num*3+1
answer+=1
return answer
좀 적응 한거 같아서 레벨 2도 풀어보기로 했다.
근데 난이도가 상당히 다르게 느껴진다. 문제가 이해부터 좀 복잡… 국어시험인가
문자열 압축
문제말이 길고 헷갈렸다. 풀었을 때 테스트 케이스 다섯개 정도만 오류남
하나는 실행 시간 엄청 짧길래 아 1이구나 해서 고쳤고
다른거는 다른사람들 질문 보면서 10넘어가면 문자열이 두자리수가 된다는 것을 까먹은 것과 카운트를 0부터 시작해서 하나 부족해지는 문제를 고쳤다
참 하나는 런타임 에러도 나서 리스트를 하나 뺐다. 리스트가 속도를 느리게 하나?
def solution(s):
answer = len(s)
for i in range(1, int(len(s)/2)+1):
count = 1
str_length = len(s)
current_slice = s[0:i]
for j in range(1, int(len(s)/i)+1):
next_slice = s[i*(j):i*(j+1)]
if current_slice == next_slice:
count += 1
else:
if count > 1:
str_length = str_length-(i*(count-1)) + len(str(count))
count = 1
current_slice = next_slice
if str_length < answer:
answer = str_length
return answer
코드가 길어져서 다른사람의 답을 읽는데 시간도 오래걸리는데다가 감흥이 없어서 후기 안씀
쉬운거 풀음
최대 공약수와 최소 공배수
설마 약수를 구해서 최소 공배수를 구하나 하고 고민하다가 그냥 다 계산하기로 했다
내풀이 확실히 레벌 2보다 쉬움
def solution(n, m):
answer = [0, 1000001]
n_set = set()
m_set = set()
for i in range(1, min(n, m)+1):
if n % i == 0 and m % i == 0:
answer[0] = i
for i in range(1, m+1):
n_set.add(i*n)
for i in range(1, n+1):
m_set.add(i*m)
answer[1] = min(n_set.intersection(m_set))
return answer
다른 사람 답. 와 나 수학 공부 다시해야 하는 거 아냐 이거를 기억 못했다
다들 유클리드 호제법으로 풀었다… 좀 창피하군..
지금도 잘 기억안나지만 스킵 나중에 한번 다시 찾아봐야지
# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
def gcdlcm(a, b):
c, d = max(a, b), min(a, b)
t = 1
while t > 0:
t = c % d
c, d = d, t
answer = [c, int(a*b/c)]
return answer
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(gcdlcm(3,12))
다른사람답. 와 이거도 되는거야? 그냥 math 모듈로 했잖아 math.gcd(n,m)
행렬의 곱셈
옛날에 numpy 썼던 기억을 되살려서 해봤다
간단하게 했는데 코딩 실력이 안늘은거 같다
numpy는 파이썬에서 제공하는 모듈이 아니라 코테에선 사용불가능할 수도 있다고 댓글에서 그러네 그럼 안써야겠다.
import numpy as np
def solution(arr1, arr2):
answer = [[]]
arr1 = np.array(arr1)
arr2 = np.array(arr2)
answer = np.dot(arr1, arr2)
return answer
역시 모듈 없이 했네
기능 개발
짜기는 빨리 짰는데 생각이 자꾸 꼬여서 자괴감 들었다.
그냥 직진하지 말고 신호등이 파란불이 되면 무조건 건너는게 아니라 차가 오는지 확인하는 것처럼 어떤 조건일 때 문제가 생길 지 생각을해야한다.
리스트가 넘어가버리는 조건을 자꾸 생각 안하고 뒤늦게 생각하니 생각이 꼬여서 누더기 처럼 고치다가 한번 싹 지웠다.
def solution(progresses, speeds):
answer = []
left_list = []
for i in range(len(speeds)):
temp = int((100-progresses[i])/speeds[i])
if (100-progresses[i]) % speeds[i] > 0:
temp += 1
left_list.append(temp)
cursor = 1
current = 0
while len(left_list) >= current+1:
while current+cursor+1 <= len(left_list):
if left_list[current+cursor] <= left_list[current]:
cursor += 1
print("current", current, "cursor", cursor, left_list)
else:
break
current += cursor
answer.append(cursor)
print("current", current, "cursor", cursor, left_list)
cursor = 1
return answer
다른 사람 코드 아 zip 사용
😭조이스틱
아직 해결 못함.. 알것 같은데 뒤집은 리스트 붙여서 가장 큰 0묶음 구해서 그거 피하는 방향으로 하면 될것 같은데
실패율
레벨1인데 런타임 에러가 30%나서 끙끙 앓았는데
나는 런타임 에러가 시간 초과란 뜻인줄 알고 코드 최적화만 하고 있었는데 RecursionError(재귀 함수의 연산이 너무 깊어졌을때 스택 초과), ZeroDivision(0으로 나눔),ValueError(값이 없는데 뭔가 하려할 때) 등등의 경우도 있다는 것을 깨달음.
테스트 값을 0으로 넣어보니 답이 바로 나오더라…
쓸데없이 정말 시간을 많이 썼어..
def solution(N, stages):
answer = []
percent_list = [] # 0 for _ in range(N)
cur_total = len(stages)
for i in range(1, N+1):
if stages.count(i) == 0:
percent_list.append(0)
else:
percent_list.append(stages.count(i)/cur_total)
cur_total -= stages.count(i)
for i in range(N):
temp = percent_list.index(max(percent_list))
print(percent_list)
answer.append(temp+1)
percent_list[temp] = -1
return answer
시간복잡도는 o(n^2)이다… 시간 꽤 걸린다.
매번 count 하지 않고 초반에 사전으로 미리 각 스테이지별 인원을 집계해두면 정렬을 제외 했을 때 O(n)의 시간복잡도로 풀 수 있습니다.라고 한다…
다른사람 답 람다를 써서 구함.
제일 작은 수 제거하기
레벨2 잠깐 맛보다가 멘탈에 충격받아서
다시 레벨1좀 풀기로함
내 풀이 아주 쉬웠음
def solution(arr):
answer = []
min_num=min(arr)
for i in arr:
if i!=min_num:
answer.append(i)
if len(answer)==0:
answer=[-1]
return answer
댓글에서 본 팁: min 을 하면 최소값을 찾기 위해, 자체적으로 for 문을 돌아서, 시간 복잡도 n은 추가 됩니다
정수 제곱근 판별
엄청 쉬웠음 설명 없음
def solution(n):
answer = 0
if int(n**(0.5)) == n**(0.5):
answer = (n**(0.5)+1)**2
else:
answer=-1
return answer
다른 코드
# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
def nextSqure(n):
return n == int(n**.5)**2 and int(n**.5+1)**2 or 'no'
엥 이게 뭐야? return 에 and랑 or?????
n == int(n.5)2 and int(n.5+1)2 or ‘no’
and는 false 나오면 그 뒤로는 안봄
A and B
A가 참이라면 연산의 결과는 뒤에 B에 달려있으므로 그냥 B의 결과 리턴.
B가 참이라면 A and B
연산의 결과는 참인거고, B가 거짓이라면 A and B
연산의 결과는 거짓. 심지어 B가 문자여도 문자가 결과
or는 true 나오면 그뒤로는 안봄
그걸 이용해서
n == int(n.5)**2가 참이면 int(n**.5+1)2 를 결과로 반환 거짓이면 바로 no로 가네
(n == int(n.5)**2) ? (int(n**.5+1)2) : (‘no’) 이거랑 같은 거 같은데
파이썬은 다른 언어에서 볼 수 있는 ?: 문법 없다 대신 if else 를 쓴다.
요런 답도 있다.제곱수가 있는지 1로 나눈 나머지가 있는지 봐서 답 판별
def nextSqure(n):
from math import sqrt
return "no" if sqrt(n) % 1 else (sqrt(n)+1)**2
자연수 뒤집어 배열로 만들기
내코드 뭔가 기묘하게 풀었다.
def solution(n):
answer = []
num_to_str = str(n)
for i in range(len(num_to_str)-1, -1, -1):
answer.append(int(num_to_str[i]))
return answer
다른사람 reversed 사용
또 다른 사람 reversed 대신[::-1]를 쓴다네 신기하네 그럼 전체 거꾸로 도나..?
정수 내림차순으로 배치하기
비효율적이고 이상하게 풀었는데 피곤해서 그냥 제출
def solution(n):
temp_list = []
for i in range(len(str(n))):
temp_list.append(str(n)[i])
temp_list.sort(reverse=True)
answer = "0"
for i in temp_list:
answer += str(i)
answer = int(answer)
return answer
남의 답
def solution(n):
ls = list(str(n))
ls.sort(reverse = True)
return int("".join(ls))
ls = list(str(n)) 헐 스트링을 한글자씩 바로 리스트로 만들어주나보네 그거 몰라서 좀 돌아갔다
join 도 모른다.
def solution(n):
return int("".join(sorted(list(str(n)), reverse=True)));
sorted하면 리스트로 반환해서 나와서 리스트로 안감싸도 된다고 한다
프린터
레벨 2인데 비교적 쉬웠다.
조건 갈리는 경우 좀 잘 생각하자 대충 휙 하고 대충 휙 틀려서 수정하고
def solution(priorities, location):
answer = 0
cur_location = location
while True:
print(priorities, cur_location)
if max(priorities) > priorities[0] and cur_location == 0:
priorities.append(priorities[0])
priorities.pop(0)
cur_location = len(priorities)-1
elif max(priorities) > priorities[0] and cur_location != 0:
priorities.append(priorities[0])
priorities.pop(0)
cur_location -= 1
else:
priorities.pop(0)
cur_location -= 1
answer += 1
if cur_location == -1:
break
return answer
다른 사람 답
any를 썼다.
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
cur = queue.pop(0)
if any(cur[1] < q[1] for q in queue):
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
댓글에서 본 팁 while True문은 피하려는 편이라고 한다 최대한 조건을 거는 형태로 작업한다고 한다. 실무에서는 데드락이나 무한루프에 빠져버리는 경우가 생길 수 있으니까요. break을 걸어준 조건문이 한번이라도 빗나가면 큰일이 벌어지기 때문에 위험하다고 생각합니다
다른사람 코드 for else를 활용
카펫
쉬웠다 야호
내코드
def countBoarder(row, col):
return 2*(row+col)+4
def solution(brown, yellow):
for i in range(1, yellow+1):
if yellow % i == 0:
if countBoarder(i, yellow/i) == brown:
break
answer = [yellow/i+2, i+2]
return answer
반복문 저만큼 다 안돌아도 되는건데 그냥 상관 없어서 돌려서 좀 마음에 걸렸다
어차피 중간에 멈출건데 상관 있나?
다른사람 코드
def solution(brown, red):
for i in range(1, int(red**(1/2))+1):
if red % i == 0:
if 2*(i + red//i) == brown-4:
return [red//i+2, i+2]
반복 부분은 딱 제곱수만큼까지만 구하고 거희 비슷하긴한데..
2*(i + red//i) == brown-4: 이 부분뭐지
헐 // 연산자(Floor Division)이라고 나누고 소수점있으면 가우스 적용하는 연산자가 있네 처음 알았다
결국 그럼 생각자체는 나랑 비슷하긴 하다..
import math
def solution(brown, yellow):
w = ((brown+4)/2 + math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
h = ((brown+4)/2 - math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
return [w,h]
근의 공식으로 푼 사람도 있다.
The inverse of the split method is join
split의 반대가 join 이었다.
https://blockdmask.tistory.com/468
파이썬 deep copy
파이썬은 [condition] ? [true_value] : [false_value] 이런 형태의 삼항연산자가 없다
[true_value] if [condition] else [false_value] // 파이썬 지원
😭큰수 만들기
아직 못풀었다
테스트 케이스 10번만 시간초과
아예 코드를 최대 찾는 식으로 해야할 듯
이상한 문자 만들기
멘탈 회복을 위해 푼 쉬운 문제
근데 한방에 안풀려서 멘탈이 또 위험
이런건 한방에 좀 풀어라
def solution(s):
answer = ''
temp_list = s.split(" ")
for i in range(len(temp_list)):
temp_word = ""
for j in range(len(temp_list[i])):
if j % 2 == 0:
temp_word += temp_list[i][j].upper()
else:
temp_word += temp_list[i][j].lower()
temp_list[i] = temp_word
answer = " ".join(temp_list)
return answer
다른사람 답
enumerate를 알아야겠다.
def toWeirdCase(s):
return " ".join(map(lambda x: "".join([a.lower() if i % 2 else a.upper() for i, a in enumerate(x)]), s.split(" ")))
가운데글자 가져오기
쉬움 한방
def solution(s):
if len(s) % 2 == 0:
return s[int(len(s)/2)-1]+s[int(len(s)/2)]
else:
return s[int(len(s)/2)]
다른사람 답 본받자
def string_middle(str):
# 함수를 완성하세요
return str[(len(str)-1)//2:len(str)//2+1]
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(string_middle("power"))
시저 암호
alphabet = "abcdefghijklmnopqrstuvwxyz"
def solution(s, n):
answer = ''
for i in range(len(s)):
if s[i].lower() in alphabet and s[i].lower() == s[i]:
answer += alphabet[(alphabet.index(s[i].lower())+n) %
len(alphabet)]
elif s[i].lower() in alphabet and s[i].upper() == s[i]:
answer += alphabet[(alphabet.index(s[i].lower())+n) %
len(alphabet)].upper()
else:
answer += s[i]
return answer
남의 답
# 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
# 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
def caesar(s, n):
s = list(s)
for i in range(len(s)):
if s[i].isupper():
s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
elif s[i].islower():
s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))
return "".join(s)
# 주어진 문장을 암호화하여 반환하세요.
# 실행을 위한 테스트코드입니다.
print('s는 "a B z", n은 4인 경우: ' + caesar("a B z", 4))
isupper islower chr ord 다 모름
성격유형 검사지
엄청 쉬운데 지문이 길고 내용이 많았다
def solution(survey, choices):
choices_dict = {"R": 0, "T": 0, "C": 0,
"F": 0, "J": 0, "M": 0, "A": 0, "N": 0}
answer = ''
for i in range(len(survey)):
if choices[i] <= 3:
choices_dict[survey[i][0]] += 4-choices[i]
elif choices[i] >= 4:
choices_dict[survey[i][1]] += choices[i]-4
if choices_dict["R"] >= choices_dict["T"]:
answer += "R"
else:
answer += "T"
if choices_dict["C"] >= choices_dict["F"]:
answer += "C"
else:
answer += "F"
if choices_dict["J"] >= choices_dict["M"]:
answer += "J"
else:
answer += "M"
if choices_dict["A"] >= choices_dict["N"]:
answer += "A"
else:
answer += "N"
return answer
와 나랑 진짜 거의 똑같은 풀이 봤다
아 이풀이가 좀더 좋은듯
def solution(survey, choices):
my_dict = {"RT":0,"CF":0,"JM":0,"AN":0}
for A,B in zip(survey,choices):
if A not in my_dict.keys():
A = A[::-1]
my_dict[A] -= B-4
else:
my_dict[A] += B-4
result = ""
for name in my_dict.keys():
if my_dict[name] > 0:
result += name[1]
elif my_dict[name] < 0:
result += name[0]
else:
result += sorted(name)[0]
return result
오픈채팅
레벨2인데 쉬웠다
def solution(record):
messages_stack = []
ids = {}
answer = []
for i in range(len(record)):
words = record[i].split(" ")
if words[0] == "Enter" or words[0] == "Leave":
messages_stack.append([words[0], words[1]])
if words[1] not in ids.keys() or (words[0] == "Enter" and ids[words[1]] != words[2]) or words[0] == "Change":
ids[words[1]] = words[2]
for i in range(len(messages_stack)):
if messages_stack[i][0] == "Enter":
answer.append(ids[messages_stack[i][1]]+"님이 들어왔습니다.")
if messages_stack[i][0] == "Leave":
answer.append(ids[messages_stack[i][1]]+"님이 나갔습니다.")
return answer
근데 다른사람 답을 보니 내꺼 엄청 복잡..
다른사람 답
나는 레코드 훑으면서 메세지를 따로 저장하는 스택으로 만들면서 이름딕셔너리도 만들고 이후에 답변 리스트 따로 만들었는데
여기는 이름딕셔너리만 만들고 답변 리스트를 바로 만들었네
def solution(record):
answer = []
namespace = {}
printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
for r in record:
rr = r.split(' ')
if rr[0] in ['Enter', 'Change']:
namespace[rr[1]] = rr[2]
for r in record:
if r.split(' ')[0] != 'Change':
answer.append(namespace[r.split(' ')[1]] + printer[r.split(' ')[0]])
return answer
다른사람 답 와 이건 정말 신기하네
def solution(record):
user_id = {EC.split()[1]:EC.split()[-1] for EC in record if EC.startswith('Enter') or EC.startswith('Change')}
return [f'{user_id[E_L.split()[1]]}님이 들어왔습니다.' if E_L.startswith('Enter') else f'{user_id[E_L.split()[1]]}님이 나갔습니다.' for E_L in record if not E_L.startswith('Change')]
괄호변환
재귀함수여서 좀 쫄았다. 근데 문제 더듬더듬읽고 그대로 풀었더니 풀렸다.
뭔가 마음이 명료하지 않은게
def solution(p):
answer = ''
u = ""
v = ""
stack = []
if len(p) == 0:
return ""
for i in range(len(p)):
if p[:i+1].count("(") == p[:i+1].count(")"):
u = p[:i+1]
v = p[i+1:] if len(p) >= i+1 else ""
break
for i in range(len(u)):
if u[i] == "(":
stack.append(u[i])
elif (u[i] == ")" and len(stack) > 0 and stack[-1] == "("):
stack.pop()
else:
temp = ""
for i in range(1, len(u)-1):
temp += ")" if u[i] == "(" else "("
return "("+solution(v)+")"+temp
return u+solution(v)
다른사람답
def solution(p):
if p=='': return p
r=True; c=0
for i in range(len(p)):
if p[i]=='(': c-=1
else: c+=1
if c>0: r=False
if c==0:
if r:
return p[:i+1]+solution(p[i+1:])
else:
return '('+solution(p[i+1:])+')'+''.join(list(map(lambda x:'(' if x==')' else ')',p[1:i]) ))
이해가 안되네… 람다 나도 해야하나
멀리 뛰기
문제 보자마자 조합으로 풀었는데 테스트 케이스가 런타임 에러나는 것이었다….
보니까 재귀로는 스택 초과 되어서 코테에서는 재귀로 문제를 잘 안푼다고 한다.
그래서 약분 한걸로 다시했는데 여전히 에러…
하…그래서 여기다가 DP도 섞어서도 해봄..
그래서 질문글들 쭉 봤는데 접근방식부터 틀린 것이었다.
근데도 안되는 것이었다.
피보나치 수열로 점화식으로 풀었단다..
누가 올려준 코드를 언어만 바꿔서 해봤는데 바로 풀림….
근데 점수가 쭉 올라가길래 죄책감이 들었다.
문자열을 정수형으로 바꾸기
?? 파이썬으로 너무 쉬운거 아닌가?
def solution(s):
answer = int(s)
return answer
두 정수 사이의 합
def solution(a, b):
answer = 0
if a < b:
small = a
big = b
else:
small = b
big = a
for i in range(small, big+1):
answer += i
return answer
문자열 내림차순으로 배치하기
흠… 내답
def solution(s):
temp = list(s)
for i in range(len(temp)):
temp[i] = ord(temp[i])
temp.sort()
for i in range(len(temp)):
temp[i] = chr(temp[i])
temp.reverse()
answer = "".join(temp)
return answer
남의 답
def solution(s):
return ''.join(sorted(s, reverse=True))
sorted는 조건도 줄수있고 문자열에도 작동한다
def solution(s):
s = list(s)
s.sort(reverse = True)
answer = ""
for i in s:
answer = answer + i
return answer
아니네 바로 sort되는 구나 내가 뭘 착각했지 리버스도 쏘트 할때 되나보다
수박수박수
아주 쉬웠지만 내답 나름 짧다! 뿌듯
def solution(n):
answer = "수박"*(n//2)+"수"*(n % 2)
return answer
다른 사람답 우와
def water_melon(n):
s = "수박" * n
return s[:n]
# 실행을 위한 테스트코드입니다.
print("n이 3인 경우: " + water_melon(3));
print("n이 4인 경우: " + water_melon(4));
문자열 다루기 기본
문제를 끝까지 안읽어서 문제 생김
def solution(s):
answer = False
if len(s) == 6 or len(s) == 4:
answer = True
for i in range(len(s)):
if s[i] not in "1234567890":
answer = False
break
return answer
다른 답
def alpha_string46(s):
return s.isdigit() and len(s) in (4, 6)
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print( alpha_string46("a234") )
print( alpha_string46("1234") )
isdigit 으로 숫자인지 아닌지 알 수 있는걸 첨알음
김서방 찾기
내답
def solution(seoul):
answer = ''
for i in range(len(seoul)):
if seoul[i] == "Kim":
answer = "김서방은 "+str(i)+"에 있다"
break
return answer
남의 답 {} format이 인상적
def findKim(seoul):
return "김서방은 {}에 있다".format(seoul.index('Kim'))
엥 이거 왜 이런거지 sort 바로하면 왜 결과가 다르지
print([“z”,”d”].sort()) None k=[“z”,”d”] k [‘z’, ‘d’] k.sort() k [‘d’, ‘z’]
와 sort 이런거도 되네 abs 조건으로 절대값 정렬
https://stackoverflow.com/questions/19199984/sort-a-list-in-python
아 뭔가 깨달았다
a.sort()는 sort된 a를 바로 리턴해주는 것이 아니구나
a.sort <built-in method sort of list object at 0x7fbce00fd680> a.sort() a [‘bed’, ‘car’, ‘sun’]
문자열 내맘대로 정렬
dict 사용법을 정확하게 잘 몰라서 좀 오래걸렸다
def solution(strings, n):
hash_dict = {}
answer = []
for i in range(len(strings)):
if strings[i][n] in hash_dict.keys():
hash_dict[strings[i][n]] = hash_dict.get(
strings[i][n])+[strings[i]]
else:
hash_dict[strings[i][n]] = [strings[i]]
temp = list(hash_dict.keys())
temp.sort()
for i in temp:
temp_list = hash_dict.get(i)
temp_list.sort()
answer += temp_list
return answer
우와 남의답
아 근데 현재는 같은 글자에 여러개 있을때 사전순이 안된다고 한다
def strange_sort(strings, n):
'''strings의 문자열들을 n번째 글자를 기준으로 정렬해서 return하세요'''
return sorted(strings, key=lambda x: x[n])
와 이건 뭐지
def strange_sort(strings, n):
def sortkey(x):
return x[n]
strings.sort(key=sortkey)
return strings
와 다다르네
from operator import itemgetter, attrgetter, methodcaller
def solution(strings, n):
return sorted(sorted(strings), key=itemgetter(n))
list 보다 set이 빠르다
https://checkwhoiam.tistory.com/87
소수 찾기
내코드 다른사람들 다짧게 풀어서 놀랐다.
음 뒷자리가 1 3 5 7 9 로 시작해서 bfs로 이어붙이고 이걸 소수인지 아닌지 판별했다.
근데 2도 소수라는 것을 까먹었다던가
길이가 짧다던가
def isPrime(n):
count = 0
if n == 1 or n == 0:
return False
if n == 2:
return True
for i in range(2, int(n**(0.5))+1):
if n % i == 0:
count += 1
return False if count > 0 else True
def solution(numbers):
answer = 0
numbers = list(numbers)
visited = []
not_visited = []
start_point = 0
end_point = 0
depth = 0
for i in ["1", "3", "5", "7", "9"]:
if i in numbers:
visited.append([i])
not_visited.append(
numbers[:numbers.index(i)]+numbers[numbers.index(i)+1:])
end_point += 1
if "2" in numbers:
answer += 1
if len(visited) == 0:
return answer
while depth <= len(numbers):
depth += 1
for i in range(start_point, end_point):
for j in range(len(not_visited[i])):
visited.append(visited[i]+[not_visited[i][j]]
if len(not_visited[i]) > 0 else [])
not_visited.append(not_visited[i][:j]+not_visited[i][j+1:])
start_point = end_point
end_point = len(visited)
number_set = set()
for i in range(len(visited)):
visited[i].reverse()
current_number = int("".join(visited[i]))
if current_number not in number_set and isPrime(current_number):
answer += 1
number_set.add(current_number)
return answer
다른사람 코드 잘 이해는 안되는데 라이브러리 쓴게 많다
from itertools import permutations
from collections import defaultdict
from itertools import permutations
def solution(n):
a = set()
for i in range(len(n)):
a |= set(map(int, map("".join, permutations(list(n), i + 1))))
a -= set(range(0, 2))
for i in range(2, int(max(a) ** 0.5) + 1):
a -= set(range(i * 2, max(a) + 1, i))
return len(a)
=은 | 의 결과를 update한다는 뜻 아 그니까 결과에 or한거를 다시 결과에 넣어준다 |
a=a | b |
a | =b인거구나 |
https://velog.io/@nayoon-kim/파이썬-연산자
근데 거의다들 모든 조합 다 만들어서 소수 찾는걸로 푼거 같잖아
피보나치 수
재귀 함수 썼더니 런타임 에러 스택오버플로우 나서 dp로 싹 고쳤다.
재귀 함수는 그냥 쓰면 안되는 것인가
dp = {0: 0, 1: 1}
def fib(n):
for i in range(2, n+1):
dp[i] = dp[i-1]+dp[i-2]
return dp[n]
def solution(n):
return fib(n) % 1234567
재귀 함수를 쓰거나 그럴때 테스트 케이스에다가 최대 조건 값을 한번 넣어 보는 것도 좋을 것 같다는 생각을 했다
남의 답
def fibonacci(num):
a,b = 0,1
for i in range(num):
a,b = b,a+b
return a
# 아래는 테스트로 출력해 보기 위한 코드입니다.
print(fibonacci(3))
for 문 속에 a,b=b,a+b를 a=b b=a+b라고 분래해 쓰면 다른 결과가 나오네요? 두 표달식은 다른 의미를 갖는건가요? 그냥 똑같은 걸 다르게 쓰는게 아닌가요? ― Quan 님에 질문에 대한 답변을 드리자면.. a=b b=a+b 라고 쓰면 순서가 정해 지기 때문에 먼저 계산한 결과 값을 가지고 다음 계산식을 계산하는 것이고 a, b = b, a+b 라고 쓰면 동시에 작업이 이루어 지기 때문에 결과값이 다릅니다^^
그렇다고 한다
jadencase 문자열 만들기
레벨2인데 쉬웠다. 이상하네
def solution(s):
answer = ''
for i in range(len(s)):
if s[i] in "1234567890 ":
answer += s[i]
elif i == 0 or (i-1 > 0 and s[i-1] == " "):
answer += s[i].upper()
else:
answer += s[i].lower()
return answer
다른 사람 답 title()함수를 사용하면 단어를 자동으로 대문자를 만들어주나보네 근데 문제 개편되어서 공백두개나 공백으로 시작하면 작동 안한다고 한다.
폰켓몬
hash = {}
def solution(nums):
answer = 0
for i in nums:
if i in hash.keys():
hash[i] = hash[i]+1
else:
hash[i] = 1
if len(nums)/2 > len(hash.keys()):
answer = len(hash.keys())
else:
answer = len(nums)/2
return answer
남의 답 헐 대박
def solution(ls):
return min(len(ls)/2, len(set(ls)))
있는지 없는지 확인만하면되니까
그냥 set만 쓴 사람도 있네
def solution(nums):
answer = 0
myList = set(nums)
if len(nums)/2 > len(myList):
answer = len(myList)
else:
answer = len(nums)/2
return answer
더 맵게
heap 유형의 문제라고 써있는데 무시하고 그냥 리스트 썼더니 효율성 검사에서 시간 초과남
그래서 heap을 구현해야하나 하고 찾아봤는데 라이브러리 있길래 그냥 썼더니 통과 되네
from heapq import heappush, heappop
# def solution(scoville, K): 시간초과
# answer = 0
# scoville.sort()
# while scoville[0]<K:
# if len(scoville)<=1:
# answer=-1
# break
# temp1=scoville.pop(0)
# temp2=scoville.pop(0)
# scoville.append(temp1+2*temp2)
# scoville.sort()
# answer+=1
# return answer
def solution(scoville, K):
answer = 0
heap = []
for i in scoville:
heappush(heap, i)
while heap[0] < K:
if len(heap) <= 1:
answer = -1
break
temp1 = heappop(heap)
temp2 = heappop(heap)
heappush(heap, temp1+2*temp2)
answer += 1
return answer
다른 사람도 이거 썼네 heap을 구현하지 않아도 되는 건가
import heapq as hq
def solution(scoville, K):
hq.heapify(scoville)
answer = 0
while True:
first = hq.heappop(scoville)
if first >= K:
break
if len(scoville) == 0:
return -1
second = hq.heappop(scoville)
hq.heappush(scoville, first + second*2)
answer += 1
return answer
코드들을 보니 다들 import heapq를 하셨는데 저는 heap을 몰라서..ㅎㅎ queue만 써서 풀었는데도 시간이 heap을 쓴 풀이의 절반 정도 걸리네요. 저는 섞어서 나온 새로운 값, mix들을 별도의 queue에 넣었는데 이게 가장 큰 요인같네요. 나중에 나온 mix값이 먼저 나온 것보다 클 수밖에 없어서 섞는 순서대로 queue에 넣어주면 크기 순서를 신경 쓸 필요가 없어요. 그냥 popleft로 꺼내면 무조건 mix값의 최소입니다ㅎ
준혁님 댓글보고 참고해서 문제풀이해봤는데요 scoville과 mix 두가지 자료를 모두 이용하려면 고려해야하는 경우가 상당히 많아지기 때문에 if문이 너무 많아집니다. 그런데 deque의 popleft하나만으로 연산이 확줄어서 효율성테스트에서 런타임이 절반 가까이 줄어드네요!!
라는 댓글이 있었는데 흥미
다른 남의 답 축약해서 쓴거랑 트라이 익셉트가 인상적
from heapq import heapify, heappush, heappop
def solution(scoville, K):
heapify(scoville)
for i in range(1000000):
try:
heappush(scoville, heappop(scoville)+(heappop(scoville)*2))
if scoville[0] >= K: return i+1
except:
return -1
Try excepy 활용
알고리즘 라이브러리
https://velog.io/@gndan4/알고리즘-관련-파이썬-주요-라이브러리
파이썬 큐
https://www.daleseo.com/python-queue/
파이썬 힙
https://www.daleseo.com/python-heapq/
Python의 itertools를 이용하면 순열과 조합을 for문 없이 구현할 수 있다.
https://velog.io/@dramatic/Python-permutation-combination-순열과-조합
소수 만들기
from itertools import combinations
def isPrime(n):
count = 0
for i in range(2, int(n**(0.5))+1):
if n % i == 0:
count += 1
return False if count > 0 else True
def solution(nums):
answer = 0
permute = list(combinations(nums, 3))
for i in range(len(permute)):
if isPrime(sum(permute[i])):
answer += 1
return answer
이거 채점 치팅인데
메소드 오버로딩?을 해서 하는 거라는데
임의로 만든 Class를 리턴하고 채점방식이 if 리턴값==정답값 을 통해 이루어지는것을 이용하여 eq메소드를 재정의하여 어떤값과 비교해도 true가 나오도록 한 편법입니다.
class ALWAYS_CORRECT(object):
def __eq__(self,other):
return True
def solution(a):
answer = ALWAYS_CORRECT()
return answer;
타겟넘버
bfs 문제 어쩐지 쉽다고 했더니 1점밖에 안주더라
def solution(numbers, target):
answer = 0
bfs_list = [numbers[0], -numbers[0]]
start_point = 0
end_point = 1
for i in range(1, len(numbers)):
temp = 0
for j in range(start_point, end_point+1):
bfs_list.append(bfs_list[j]+numbers[i])
bfs_list.append(bfs_list[j]-numbers[i])
temp += 2
start_point = end_point+1
end_point += temp
count_target = 0
for i in range(start_point, end_point+1):
if bfs_list[i] == target:
count_target += 1
return count_target
다른 사람 답 재귀 알고리즘…
def solution(numbers, target):
if not numbers and target == 0 :
return 1
elif not numbers:
return 0
else:
return solution(numbers[1:], target-numbers[0]) + solution(numbers[1:], target+numbers[0])
이터툴 이건 뭐지
from itertools import product
def solution(numbers, target):
l = [(x, -x) for x in numbers]
s = list(map(sum, product(*l)))
return s.count(target)
dfs로 풀었잖아? 나중에 다시 봐야겠다
answer = 0
def DFS(idx, numbers, target, value):
global answer
N = len(numbers)
if(idx== N and target == value):
answer += 1
return
if(idx == N):
return
DFS(idx+1,numbers,target,value+numbers[idx])
DFS(idx+1,numbers,target,value-numbers[idx])
def solution(numbers, target):
global answer
DFS(0,numbers,target,0)
return answer
mutable이랑 넘파이 astype 무슨뜻이지
lazy evaluation
map
filter
실행 할때 작동함 미리 해놓는게 아니라
큰 리스트에 담기에는 메모리가 걱정될 때 사용
try:
except Exception as e
except에다가 이걸 넣으면 코드에 실행해 볼 수 있어서 무슨 에러 났는지 보임
import pdb
pdb.set_trace()