본문 바로가기

Algorithm123

[Swift][프로그래머스][정렬] 가장 큰 수 요구능력 정렬과 문자열에 대한 이해 문제풀이 Swift의 경우 sort()함수를 제공한다. sort()함수는 Timsort라는 정렬 알고리즘으로 이루어져있는데, Timsort는 insertionSort와 mergeSort가 합쳐진것이라고 한다. swift에서 알고리즘문제를 풀면서 거의 유일(?)하게 빠르고 좋은함수인것같다. 최악의 경우에도 O(nlogn)의 성능을 뽑아낸다. 이 문제는 이미 문제에 풀이법을 적어놨다. 문자열로 처리해서 리턴해라... 그렇다. 정렬할때도 문자열로 처리해서 더 큰 경우의 수를 맨앞에 놓는 내림차순을 하면 되는것이었다. 쉽게 설명하자면 [6, 10, 2]가 있으면 "\(6)" + "\(10)" 과 "\(10)" + "\(6)" 중 크게나오는 경우로 내림차순을 하라는 말이다. 그.. 2022. 4. 13.
[Swift][Programmers][Queue] 프린터 요구능력 큐에대한 이해 문제풀이 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다. 위의 문제의 조건을 보면 맨앞에서 꺼내서 맨뒤로 넣는다. 전형적인 큐를 이야기 하고있다. 나의 경우 귀찮아서 문제를 지저분하게 풀었지만 튜플을 이용해서 큐를 사용하면 더욱 깔끔하게 문제를 해결 할 수 있다. ABCD를 넣어서 푸는사람도 있겠지만 이 역시 귀찮아서 identy배열에 0부터 queue의 개수만큼 넣어줘서 고유한 숫자로 적용해줬다. priorities가 [2, 1, 3, 2]라면 identy는 ["0", "1", "2", "3"]이렇게.. 2022. 4. 12.
[Swift][Programmers][고득점Kit] 기능개발 요구능력 큐 문제풀이 최악의 경우 시간복잡도가 O(n^2)이지만, 배열길이들이 100개이하라고 해서 아무리 최악의 경우라도 10000번이라 그냥 브루트포스로 풀었다. Swift의 경우 배열에 넣어놓고 removeFirst()를 사용하면 큐처럼 FIFO방식으로 구현이 가능하다. 이 문제는 시간복잡도를 크게 고려하지 않아도 풀 수 있도록 만들어놔서 상관없지만, 나중가면 removeFirst()의 O(n)의 시간복잡도가 아주 골치아파지니 자주 사용은 안하는걸 권해드린다. 나는 queue가 비어있지 않으면 계속 반복하면서 queue에 speed만큼을 더해주었고 그 queue를 맨처음부터 돌리면서 100이넘으면 계속 탐색(count에 1을 더하고 queue와 speed에서 FIFO방식으로 맨앞을 빼주었다.)하고 .. 2022. 4. 12.
[Swift][BFS] 백준 1600번 (말이 되고픈 원숭이) 요구능력 BFS 문제풀이 기본적인 BFS에서 우리는 최소의 이동횟수를 구해야한다. 어느부분에서 점프했을때 최소의 이동거리인지 알 수 있는 방법이 없기 때문에 BFS를 돌아주면서 방문하는 곳마다 점프하는 경우를 큐에 넣어준다. 이때 점프횟수가 남아있을 때만 점프를 해준다. 이 문제에서 가장 핵심포인트는 3차원 배열을 사용해서 한 지점에 도착했을 때 몇번의 점프가 남았는지를 적어주는 것이다. 무슨 말이냐면 만약 내가 점프를 한번도안하고 (0,0)부터 (x,y)까지 이동했을 경우가 있고, 점프를 한번하고 (x,y)까지 이동했을 경우가 있다고 가정해보자. 근데 같이 방문처리를 해줘버리면, 이게 겹치게된다. 따로 관리하기위해서 3차원으로 방문처리를 해주게된것이다. 그리고 도착지점에 도착했을 때 바로 break를 .. 2022. 4. 8.