본문 바로가기

코딩테스트

[프로그래머스(Programmers)/Level2] 전화번호 목록 단순히 문자열 하나씩 골라 포문을 돌며 그 외 길이가 더 긴 문자열을 찾으면 접두어인지 판단하고 맞으면 false를 return하는 방식으로 풀었다. 너무 단순 노가다로 푼 문제라 통과안되면 다른 풀이법을 생각해보려 했으나 통과가 되었다... 고민하다가 구글링 해 본 결과 정렬한 후(정렬하면 최소 앞뒤에서 찾을 수 있다.) 바로 뒤에 문자열들과 비교하면서 접두어를 포함하는지 찾으면 된다는 방법을보고 더욱 열심히 공부해야겠다는 생각을 하였다.(돌려본 결과 그렇게 많은 차이는 나지 않았지만 이는 테스트케이스 문제인 것 같다..) 더보기
[프로그래머스(Programmers)/Level2](Python) 소수 찾기 permutation을 이용해서 종이조각을 한장씩 늘려가며 가능한 순열들을 구하고, 이를 정수형으로 바꿔서 소수를 찾아주는 함수인 is_prime을 통해 소수인지 판별하고 소수면 set에 더해준다.(중복되는 숫자가 있을수도 있기 때문이다.) 마지막으로 결과 셋인 res의 길이를 return해주면 원하는 결과값을 얻을수 있게 된다. 소수를 구하는 함수를 작성하는 도중에 math.sqrt를 이용해서 구하면 시간복잡도를 절반 가까이 줄일수 있어 효율적이라는 사실을 깨달았고, 직접 바꿔서 코드를 돌려본 결과 걸리는 시간이 엄청나게 차이난다는 사실을 깨달았다. 추가적으로 set , list 간의 상호변환 에대해 공부할 수 있었고 '011'과 같은 문자열을 int형으로 바꾸면 앞의 0이 날라간다는 사실도 배웠다.(.. 더보기
[프로그래머스(Programmers)/Level2](Python) 더 맵게 heapq로 뽑았을때 항상 최솟값이 뽑히게 하고 조건에따라 연산을 한 뒤 다시 넣어주는 것을 반복하는데, 스코빌이 제일 낮은게 K보다 크거나 같을때 무한루프종료, 남은 원소가 하나고 K보다 작은 스코빌 지수를 가지고 있을때 -1 return, 제일 낮은 스코빌지수와 그다음 스코빌지수가 둘다 0 일경우 -1 return과 같은 조건들을 처리해주며 count를 증가시키면 정답이 return 되게 된다. heapq에 대해서 배울수 있었고, 역시 문제를 잘 읽고 예외적인 상황들을 잘 처리해 주어야 한다는 점을 배웠다. 더보기
[프로그래머스(Programmers)/Level2] 문자열 압축 문자열을 몇개 단위로 반복하든 최소 한번은 반복 되어야 하기 때문에 len(s)//2 +1까지만 끊어주고, 반복 되는 횟수 만큼 count를 증가 시켜주고 이어 붙여주어 해당 문자열의 길이를 list에 추가해주면 몇글자로 끊어야 최소 문자열로 압축 되는지 알 수 있다. answer리스트에서 최솟값을 리턴해주면 정답이 된다. 엄청 시간을 소요한 문제인데, 이유는 a=[1,2,3,4,5]일때, a[3:8]과 같은 부분리스트는 당연히 오류가 날 것이라고 생각했기 때문이다. 해본 결과 오류가 나지 않고 인덱스를 벗어나면 그냥 해당 리스트의 끝원소 까지 포함하는 것이었다. 추가적으로 문제의 조건을 꼼꼼히 읽지않아 문자열의 길이가 1 일때 예외적으로 처리해주는 부분을 빠트렸다. 약 30분 동안 왜 틀린지 모르다가 .. 더보기
[프로그래머스(Programmers)/Level2](Python) 프린터 deque생성 후, deque에(우선순위,인덱스) 순으로 넣어주고 location과 같은 인덱스가 나올때까지 deque 첫번째 원소의 우선순위가 최대값이면 빼주고 아니면 빼고 맨뒤에 다시 삽입하는 것을 반복한다.(인쇄 되면 answer을 증가시켜 몇번째에 인쇄 되었는지 확인) 단순히 list를 이용해서 풀면 맨 앞의 원소를 제거할때마다 O(N)이지만 collections framework의 deque의 popleft로 빼주면 O(1) 이 나와 더 효율적이라는 사실을 깨달았고 max함수를 사용할때 리스트 안에 원소들이 리스트일 경우 맨 앞 원소를 기준으로 뽑는다는 것도 배운 문제였다. 더보기
[프로그래머스(Programmers)/Level2](Python) 주식가격 가격이 떨어지기전까지 time을 증가시켜주다가 1.range(i+1,len_prices)안에서 가격이 떨어지면 바로 answer list에 추가하고 for문 탈출하고, 아니면 for문을 벗어나서 time을 answer list에 넣어준다.(이를 flag로 판별) 마지막 주식가격은 항상 0동안 유지되므로 별개로 처리해주면 맞는 답이 나온다. flag가 아주 유용하게 자주쓰인다는 사실을 이때까지 문제를 통해 깨달았다.(비록 나의 풀이긴 하지만,,,,) 이문제는 쉬웠지만 계속해서 이런식으로 시간복잡도 생각을 안하고 풀면 나중에 문제가 될것 같아 앞으로 많은 양의 입력과 계산에 대비해 복잡도를 최대한 줄이려고 노력해 봐야겠다. 더보기
[프로그래머스(Programmers)/Level2](Python) 탑 우측부터 신호를 발사하므로 리스트를 뒤집어 계산하기 편하게 좌측부터 우측으로 발사 한다고 가정한 뒤, 인덱스를 하나씩 늘려가며 어느 탑에서 신호를 받는지 if문으로 확인하고 신호를 받아주는 탑을 미리 만들어놓은 answer 배열에 넣어주고 다시 뒤집어 주면 answer리스트에 올바른 값이 들어가게 된다. 문제를 계산하기 편하게 바꾼뒤 해결하는 방법을 배웠다. 더보기
[프로그래머스(Programmers)/Level2](Python) 다리를 지나는 트럭 다리위에 있는 트럭리스트, 대기하는 트럭리스트 2개를 만들어 이 두 리스트가 다 비어있을 때까지 반복하게 하였다. 먼저 트럭리스트에 [무게,다리에서얼만큼 갔는지를 뜻하는 index(초기값0)]를 세팅해주고, 대기트럭중 맨 처음 트럭의 무게와 다리에있는 트럭들의 무게의 합이 다리가 견딜 수 있는 무게 이하면 다리위에 있는 트럭리스트에 넣어주고, 다리 위에 있는 트럭 들의 index증가, 다 건넜으면 리스트에서 빼주는 방법으로 문제를 풀었다. 느낀게 상당히 많은 문제였는데, 먼저 변수이름을 잘 지어야 한다는 사실이다. 코드를 보면 너무 난잡하고 헷갈리게 변수명을 지었는데 변수가 많을수록 약간 헷갈렸다. 두번째로 별도의 클래스를 직접생성하지 않고도(ex. 변수로 index와 weight를 가진 truck cl.. 더보기