기본기 다지기/코테 오답노트 8

[프로그래머스] 달리기 경주 (파이썬, 시간복잡도 개선)

[문제]callings에 등장하는 항목을 앞 항목하고 바꿔치기하는 문제였다.시간복잡도를 고려하는 게 문제의 포인트였다.   [코드]처음에는 아무 생각 없이 아래와 같이 코드를 짰다. def solution(players, callings): for i in callings: f_index = players.index(i) j = players[f_index-1] players[f_index] = j players[f_index-1] = i return players for문 안에서 i의 인덱스 찾아서 앞 항목과 바꿔치기하는 방법을 사용했다.   [왜 틀렸나]시간초과가 떴다.players의 길이가 50,000개 이하, callings의 길..

[프로그래머스] 옹알이(2) (파이썬)

내 풀이를 바탕으로 지피티와 함께 조금 다듬어봤다.  [문제]애기가 옹알이로 할 수 있는 말의 개수를 구하는 문제였다.아직 4가지 단어만 말 할 수 있고, 애기기 때문에 연속해서 같은 단어를 발음하지 못한다.   [코드]내 코드이다.먼저 슬라이싱으로 처리하기 위해서 2글자 단어('ye', 'ma')와 3글자 단어('aya', 'woo')가 등장했을 때의 2가지 경우로 나눴다.각 경우에서 babble의 앞 단어가 애기가 발음할 수 있는 단어이면, front_word라는 단어에 그 단어를 추가하고 babble에서 그 단어를 없애줬다. 여기서 추가한 단어가 기존의 front_word 단어와 같으면 발음할 수 없으므로 break.babble의 앞단어가 애기가 발음할 수 없는 단어여도 바로 break.babble..

[프로그래머스] 햄버거 만들기 (파이썬)

시간초과로 오류가 나서, 그리고 내 코드도 마음에 들지만 다른 사람 코드가 더 깔끔해보여서 기록해본다. [문제]애니팡 같은 문제였다. 특정 패턴이 반복되면 팡 터지고 지워져서 붙여지면 다시 팡 터지고를 반복하는 문제였다.  [코드]while로 리스트 안에서 돌면서 1231이 지워지면 i를 앞으로 당겨서 풀었다.처음에 1231이 지워진다음 i-=3로 설정하지 않고 i=0으로 설정했더니 시간초과가 떴다.i=0 으로 설정하면 배열이 길어질 경우에 앞에서부터 무의미한 반복이 일어나서임을 깨닫고 i-=3로 바꿔줬다.최대 3 인덱스 이하($\because$123일 경우)에는 다시 지워질 가능성이 없기 때문이다.def solution(ingredient): answer = 0 i = 0 while i..

[프로그래머스] 대충 만든 자판 (파이썬)

[문제]대충 만든 천지인 자판으로 특정 문자열을 출력하려면 몇 번 자판을 눌러야 하는지 구하는 문제였다.  [코드]def solution(keymap, targets): answer_lst = [] apb = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' lst = [0] * 26 # 각각의 알파벳에 접근할 수 있는 가장 빠른 인덱스 찾기 for key in keymap: for i in range(len(key)): if lst[apb.index(key[i])] != 0: lst[apb.index(key[i])] = min(i+1, lst[apb.index(key[i])]) else: ..

[프로그래머스] 숫자 짝꿍 (파이썬)

내 풀이가 나름 마음에 들어서 기록해본다. [문제]  [코드]def solution(X, Y): # X_lst, Y_lst: X, Y 숫자세기용 리스트 / lst: 겹치는 숫자세기용 리스트 X_lst, Y_lst, lst = [0] * 10, [0] * 10, [] # X, Y에 있는 숫자들의 개수 세줌 for i in X: X_lst[int(i)] += 1 for i in Y: Y_lst[int(i)] += 1 # 특정 숫자가 X, Y에 모두 들어있으면 둘 중에 적은 개수만큼 lst에 저장해줌(e.g. 55, 2) for i in range(10): if X_lst[i] != 0 and Y_lst[i] != 0:..

[프로그래머스] 평행 (파이썬)

[문제]점 4개 중에 임의로 2개씩 선택했을 때, 서로 평행한 경우가 있는지 알아보는 문제였다.정답률 53%의 문제였다.[유의한 점](y2 - y1) / (x2 - x1) == (y4 - y3) / (x4 - x3) 형식으로 나누기를 사용하면x1 == x2 일 때 0으로 나누면서 오류가 날까봐 곱셈 형태로 바꿔줬다. [코드]def solution(dots): answer = 0 # [[x1, y1],[x2, y2],[x3, y3],[x4, y4]] = dots x1 = dots[0][0] y1 = dots[1][0] x2 = dots[2][0] y2 = dots[3][0] x3 = dots[0][1] y3 = dots[1][1] x4 = dots[2][1]..

[프로그래머스] 겹치는 선분의 길이 (파이썬)

[문제]겹치는 선분의 길이를 구하는 문제였다.입출력 예는 아래와 같다.정답률 60% 문제였다.linesresult[[0,1],[2,5],[3.9]]2[[-1,1],[1,3],[3,9]]0[[0,5],[3,9],[1,10]]8 [풀이 방법]1. a,b값이 -100이상 100이하이기 때문에, 냅다 [0]으로 구성된 리스트 lst를 만들어줬다. 2. 그 다음에 각각의 선분에 대해서 for문을 적용해서 돌려줬다. 3. for문 안에 for문을 또 넣어서 a(line[0])와 b(line[1]) 사이의 모든 값에 해당하는 lst의 인덱스에 +1을 하도록 했다. 4. 겹치는 부분의 길이를 구하기 위해서, lst 중 값이 2 이상인 부분의 개수를 세어주었다. 5. 세어준 개수가 답! [코드]def solution(l..

[프로그래머스] 다항식 더하기 (파이썬)

왼쪽과 같이 입력이 다항식으로 주어지면 동류항끼리 계산해서 출력을 하는 문제였다.반례를 잘 찾아야 하는 문제였다.  나는 중간의 ' + '를 기준으로 split을 해서 풀었다.그렇기 때문에 출력 형식에 따라서 하나하나 처리를 해주어야 했다.먼저 if문으로 입력이 다항식일 때, 단항식일 때를 처리해줬다. 그리고 다항식 if문 안에 출력의 형태에 따라 또 if문을 넣어주었다.출력 꼴이 ax + b 라고 할 때, 출력이 'x'일 때, 'x+b'일 때, 'b'일 때, 'ax'일 때, 'ax + b'일 때 모두 따로따로 처리해줘야 했다.다른 풀이를 봐도 뾰족한 수는 없는 것 같다.def solution(polynomial): a_part, b_part = 0, 0 # 다항식 일 때 if ' + '..