PS/프로그래머스 24

[Python] 체육복

✏️ 문제 문제 파악주의할 점은 도난당한 학생과 여벌 체육복을 가져온 학생이 같을 수 있으며 이때 도난당한 학생은 다른 사람한테 빌려주지 않는다는 점이다!set 자료형은 set 끼리 -로 간단하게 차집합을 구할 수 있고 remove를 통해 해당 값을 바로 지울 수 있다.이렇게 편리한 자료형을 사용하면 쉽게 문제를 풀 수 있다. 자료형도 잘 활용하는 것이 문제를 푸는데 중요하다!!  코드def solution(n, lost, reserve): reserve_set = set(reserve) - set(lost) lost_set = set(lost) - set(reserve) for r in reserve_set: if r-1 in lost_set: l..

[Python] 키패드 누르기

✏️ 문제 문제 파악0을 제외한 숫자 키패드를 배열에 넣어서 배열의 인덱스를 활용해서 풀었다.cur 2차원 배열에 인덱스 0에는 왼손의 마지막 위치, 1에는 오른손의 마지막 위치를 넣어 움직였을 시 해당 숫자 키패드 위치를 대입하는 코드로 짰다.   코드처음에 제출한 코드def solution(numbers, hand): answer = '' cur = [[0, 3], [2, 3]] for n in numbers: if n == 1 or n == 4 or n == 7: answer += 'L' cur[0][0] = (n-1) % 3 cur[0][1] = (n-1) // 3 elif n == ..

[Python] 로또의 최고 순위와 최저 순위

✏️ 문제 문제 파악최고 순위는 최저 순위 - 0의 개수인 걸 기준으로 코드를 짰다.최저 순위는 6이고 최고 순위는 1인데 0이 6개일 시 최고 순위가 1이 아닌 0이 되므로 이를 해결하기 위해 6이 아닌 7부터 시작했다.그리고 최저는 7이 아니라 6이므로 7일 경우 6으로 바꿔주었다.  코드def solution(lottos, win_nums): answer = [7, 7] zero = lottos.count(0) for l in lottos: if l in win_nums: answer[0] -= 1 answer[1] -= 1 if answer[1] != 1: answer[0] = ans..

[Python] 문자열 나누기

✏️ 문제 문제 파악문제 내용 그대로 하드코딩.. 으로 풀었는데 마지막에 남은 부분을 더하는데 고민을 좀 했었다..  확실히 다른 코드를 보고 다양한 풀이를 보면 더 나은 풀이 방법을 생각하게 되는 것 같다!내 코드는 아직 너무 부족해 ...ㅠ  코드def solution(s): answer = 0 first = '' x = 0 no_x = 0 for c in s: if first == '': first = c if c == first: x += 1 else: no_x += 1 if x == no_x: ans..

[Python] 둘만의 암호

✏️ 문제 문제 파악처음에 s의 각 문자들을 +1 하면서 skip에 있으면 skip에 없는 문자가 되도록 +1을 계속 더하는 코드를 for 반복문으로 했는데 for 반복문으로 하면 skip에 있으면 +1을 한 번만 더한다는 문제가 있었다.예를 들면 s = "a", skip = "bcd", index = 1 이라고 한다면결과가 a가 bcd를 넘어 e가 되어야 하는데 처음 푼 코드는 c가 출력되었다..  그래서 for 반복문 대신에 while을 써서 문제점을 해결했고 ord(해당 문자) + 1 > 122 이면 해당 문자 - 26을 해서 'a' 부터 시작하려고 했는데 이것도 좀 이상하게 출력되어서 if ord(cur) + 1 > 122: cur = 'a' 위의 코드처럼 그냥 'a'로 대입하는 게 결과가..

[Python] 대충 만든 자판

✏️ 문제 문제 파악 target의 각 문자에 대해 keymap의 여러 배열에서 해당 문자의 위치 중 최소를 구해야 한다.keymap의 "여러 배열 중에 최소 위치"를 더해야 하므로 이를 min() 메소드를 사용해서 최소 위치를 구했다.그리고 keymap에 아예 없는 문자가 오면 -1을 출력해야 하므로 이 경우도 if 조건문으로 처리해주었다.   코드def solution(keymap, targets): answer = [] for target in targets: num = 0 for t in target: temp_num = 999 for k in keymap: if t in k: ..

[Python] 완주하지 못한 선수

✏️ 문제 문제 파악처음엔 for in 돌아서 있으면 pop() 메소드를 사용해서 나머지 남은 이름을 출력하도록 코드를 짰는데 성능 테스트에서 다 시간 초과가 났다..그래서 Counter 자료구조를 사용해서 쉽게 풀었다..!  (근데 이 문제는 해시 문제라서 해시로도 풀어봐야지..)  코드실패한 코드 def solution(participant, completion): for c in completion: if c in participant: participant.pop(participant.index(c)) return participant[0]성공한 코드 from collections import Counterdef solution(pa..

[Python] 실패율

✏️ 문제 문제 파악스테이지에 도달한 플레이어 수를 구하기 위해스테이지 배열을 오름차순한 후 스테이지의 실패율을 구하면 그 스테이지에 해당하는 유저들을 스테이지 배열에서 삭제하는 방향으로 작성했다. 코드를 제출했을 때 1, 6, 7, 9, 13, 23, 24, 25번의 테스트 케이스에서 런타임 에러가 생기고 실패를 했는데 그 이유는 부모가 0인데 나눠서.. 였다.그 부분을 고치니 (else 부분) 해결되었다!  코드def solution(N, stages): answer = [] fail = [] stages.sort() for i in range(N): if len(stages) != 0: fail.append(stages.count(i+1)..

[Python] 9번 / 지폐 접기

✏️ 문제 문제 파악지폐를 90도로 돌릴 수도 있으므로 이 문제는 wallet과 bill의 배열 각 인덱스끼리 비교하는 것이 아닌 max, min 값끼리 비교하는 것이라고 생각했다. max, min 값을 기준으로 비교한다고 생각하면 조건을 쉽게 생각할 수 있다.  지폐의 큰 길이가 지갑의 큰 길이보다 작거나 같고 지폐의 작은 길이가 지갑의 작은 길이보다 작거나 같으면 지갑에 넣을 수 있다.저 조건에 안맞다면 지폐의 큰 길이를 2로 나누면 된다!  코드def solution(wallet, bill): answer = 0 while max(bill) > max(wallet) or min(bill) > min(wallet): bill[bill.index(max(bill))] = ..

[Python] [1차] 다트 게임

✏️ 문제 문제 파악제일 처음 생각했던 게 점수는 0에서 10 사이의 정수로 한 칸을 차지할 수도 두 칸을 차지할 수도 있다.그래서 점수 길이를 단정할 수 없으니 점수 하나당 S, D, T 하나가 나오게 되니까 S, D, T를 기준으로 앞에 오는 게 숫자라고 단정 짓는 게 맞다고 생각했다! (스타상 * 이나 아차상 # 도 점수 하나당 있을 수도 있고 없을 수도 있으니까 기준으로 삼을 수 없다.) 그리고 점수에 보너스까지 처리한 값을 바로 정답 변수에 넣을 수 없는 게 뒤에 스타상이 온다면 이전 점수에 2배를 해줘야 하기 때문이다.그래서 점수는 배열에 각각 처리한 값을 넣어서 스타상이 나왔을 때 처리할 수 있게 해주어야 한다. 참고로 배열의 뒷 인덱스부터 요소에 접근할 때 다음과 같이 접근할 수 있다.s..