다시봐야할 알고리즘 문제 18

백준 1941번 Swift 알고리즘 연습 - 소문난 칠공주_DFS

익숙해질만할 때 어려운 문제가 나왔다...! 이 문제는 고민을 거듭하다 결국 다른 분들의 코드를 많이 참고했는데 심지어 Swift로 된 코드는 없어서 Python 코드를 많이 참고했다..! 풀이를 보니 Combination, DFS+BFS, Backtracking 등등 다양한 개념을 혼합하여 사용해야했다. 어쩐지 BFS 하나로 안풀리더라니... 일단 기존에 풀어왔던 문제들과 제일 다른점은 현재 좌표에서 다음 좌표로 넘어갈 때 해당 지역의 값이 움직임에 영향을 전혀 미치지 않는다는 것이다. 즉, Y나 S에 상관없이 움직일 수 있었고 이때 이 모든 경로를 가능하게 하면 너무 많은 케이스가 발생하니 흔히 말하는 '가지치기'를 적용해야 했다. 그래서 dfs 함수를 사용할 때 Y가 4를 넘은 경우 바로 retur..

프로그래머스 Lv. 2 Swift 알고리즘 - 조이스틱_그리디

3일만에 알고리즘 문제를 풀었는데... 거의 2주만에 푼 느낌..? 그리고 매일 풀다가 3일 쉬니까 죄짓는 느낌이 들었다. 이제부터 알고리즘 유형에 맞게 문제를 풀어보려고 하는데 처음부터 상당히 문제를 푸는데 오래걸렸다 ㅠㅠ 그리디 유형의 문제인데 그리디는 아무리 이론을 이해하고 있어도 막상 풀 때 적용시키는 것과는 또 다른 문제가 있는 것 같다. A 상황에서 가장 최적의 방법을 선택 -> B 상황으로 이동 -> B 상황에서 가장 최적의 방법을 선택 -> ... 이런 식의 개념으로 접근하였는데 역시나 예상 외의 변수를 전부 생각하지 못했는지 틀리고 말았다! 그래서 구글링하여 코드를 참고하였다 ^^... 이 문제를 풀면서 생각한 논리적 흐름 우선 A - Z 까지 Character끼리 값을 비교하는 것은 굉..

프로그래머스 Lv. 2 Swift 알고리즘 - 메뉴 리뉴얼

못 풀었다... 이건 그냥 못 풀었다 ㅠㅠ 다른 분들의 글을 참고해보니 DFS, Combination 등등 비슷한 맥락이지만 각자만의 방식대로 풀이가 있었다. 그중 내가 가장 인상깊게 본 코드는 아래 블로그를 운영하신 분의 코드다... 다른 코드들이 굉장히 긴 코드들이 많았는데 이 분의 코드는 엄청나게 정갈하다..! 그리고 뭔가 클로져를 팍팍 쓰신 것이... 클로져 달인이신 느낌을 받았다. 이 문제는 표시해놓고 꼭 다시 한 번 복습해야겠다! (참고한 블로그: https://aios.tistory.com/entry/swift-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%A9%94%EB%89%B4-%EB%A6%AC..

프로그래머스 Lv. 2 Swift 알고리즘 - 삼각 달팽이

이 문제는 진짜 난해했다... 뭐 엄청 끄적끄적이면서 규칙을 찾아보려했는데 결국 못찾았다 ㅠㅠ 3의 배수를 이용하거나 등차 등비로도 풀 수 있을거 같았는데... 내가 못 찾은건지 이걸로는 원래 안되는 건지! 그래서 다른 분들의 풀이를 보니 달팽이 문제 유형이 몇 번 나온적이 있었나보다 ㅋㅋㅋ 삼각형 모양으로 왼쪽 변, 아래 변, 오른쪽 변 이 세가지 변을 따로 나눠서 생각해야 되는 문제였다! (참고한 블로그: https://fomaios.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9B%94%EA%B0%84-%EC%BD%94%EB%93%9C-%EC%B1%8C%EB%A6%B0%EC%A7%80-%EC%8B%9C%EC..

프로그래머스 Lv. 2 Swift 알고리즘 - 큰 수 만들기

문제 유형이 Greedy라고 나와있어서 아.. 이게 그리디구나 싶었다.. 좀 더 명확하게 하기 위해 개념을 찾아보니 '매 순간마다 최선의 경우를 고르고 다른 경우는 고려하지 않는' 알고리즘이라고 한다. 참고한 블로그에도 나와있지만 그리디의 가장 큰 문제는 최적의 해를 구하기 어렵다는 것이다. 어떤 주어진 상황에서 최고의 결과를 내기 위함이기 때문에, 그 주어진 상황이라는 것이 바뀔 때마다 최적의 해도 바뀐다. 즉, 반례 혹은 특별한 상황에 대한 대비가 되어야 한다. (참고: https://dev-mandos.tistory.com/80) 이 문제를 풀면서 생각한 논리적 흐름 결국 가장 중요한 것은 앞자리이다. 내가 사용할 수 있는 count(k) 안에서 가장 앞자리에 큰 수를 올리고 그 다음으로 오는 숫자..

프로그래머스 Lv. 2 Swift 알고리즘 - 쿼드압축 후 개수 세기

오늘도 재귀와 싸웠다... 결국 스스로 풀지 못했는데... 앞 부분까진 전부 이해하고 recursive를 걸어야하는 상황에서 어떻게 진행할지 감이 안잡혀서 다른 분들의 코드를 참고했다. (참고: https://42kchoi.tistory.com/m/374) 이 문제를 풀면서 생각한 논리적 흐름 먼저 배열의 원소들을 4등분해야하기 때문에 미리 4등분된 배열을 만들어두고 그 안에 4사분면의 위치에 맞게 원소들을 넣어주고 그 안의 원소들이 전부 0이거나 1이면 원소들을 모두 지우고 0 or 1의 원소만 넣어주었다. 이 후 하나로 합쳐지지 않은 배열을 다시 4등분으로 조각하여 Recursive를 걸어야하는데 이 부분에서 걸렸다... 다른 분들의 코드를 참고해보니 좀 이해가 갔다. 재귀를 또 4등분으로 아예 나..

프로그래머스 Lv. 2 Swift 알고리즘 - 소수 찾기

소수 찾기도 해보고 순열도 풀어봤는데... 이 문제는 요상하게 안풀리더라..! 그래서 마지막 설 연휴인만큼 내 자신과 조금 타협해서 타 블로그 분의 풀이를 참고하였다 ^^ 참고한 분의 코드가 정말 상당히 나의 머릿속 논리와 흐름이 같아서 모범답안 같은 느낌으로 가져가고자한다 :) (참고: https://jeong9216.tistory.com/358) 이 문제를 풀면서 생각한 논리적 흐름 완전탐색 문제인 만큼 모든 경우의 수를 다 고려해야한다. 먼저 주어진 numbers를 String으로 변환한 뒤 순열 방식을 사용하여 나올 수 있는 조합의 경우의 수를 전부 numSet에 insert해준다. (중복값을 제거하기 위한 Set) 순열 방식을 이용하기 위해서 재귀식을 사용하는데 numbers에 있는 값들 중 사..

프로그래머스 Lv. 2 Swift 알고리즘 - 가장 큰 수

문제를 풀다가... 중간에 정렬과 관련된 지식들을 몇가지 구글링했는데... 내가 상당히 어렵게 문제를 돌아가고 있다는 것을 발견했다. 그래서 힌트를 기반으로 문제해결..! 약간 찜찜하지만 나중에 다시 한 번 봐야겠다! 문제는 결국 어떤 수가 합쳐졌을 때 더 큰 수가 되는지 그리고 너무 큰 수가 나올 수 있기에 Int가 아닌 String으로 반환해야 한다는 것을 고려하면 된다. 이 문제를 풀면서 생각한 논리적 흐름 첫번째 원소와 두번째 원소를 붙였을 때 어떤 순서로 붙이는지에 따라 크기를 비교한다. 첫번째가 앞으로 오는 경우, 두번째가 앞으로 오는 경우 이렇게 두 가지의 경우를 비교하고 큰 수가 나오는 경우에 맞게 원소의 위치를 정렬한다. 이 과정을 모든 원소를 기반으로 진행하면(sorted가 알아서 진행..

프로그래머스 Lv. 2 Swift 알고리즘 - 2개 이하로 다른 비트

bit에 대한 이해... 알고리즘에 대한 이해가 필요하다는 생각을 하게 만들어준 문제다. 나름 열심히 규칙을 찾아서 문제를 풀었는데 1차, 2차 모두 시간 초과 문제가 발생했다. 나름 1차에 비해 2차때는 속도를 많이 줄였다고 생각했는데도 풀리지가 않았다... 그래서 구글링을 좀 해보니 nonzerobitCount와 비트연산자 두 가지 이야기들이 많이 나왔다. nonzeroBitCount라는게 있는줄도 몰랐는데... 애플공식홈페이지를 참고해보니... 2진법으로 표현했을 때 비트가 1과 같은 숫자...? 라고 해석할 수 있다. 솔직히 무슨 소린지 모르겠지만 Discussion을 보니 좀 이해가 간다 31이라는 10진수를 2진수로 바꾸었을때 나오는 1의 개수! 내가 문제를 풀면서 직접 구했던 것인데 여기선 ..

프로그래머스 Lv. 2 Swift 알고리즘 - [3차] 파일명 정렬

첨에 문제를 잘못읽어서... 중간 번호만 순서가 맞으면 되는줄 알았다...! 그래서 다시 코드를 짜기엔 너무 늦음을 깨닫고 구글링한 문제이다 ㅎㅎ 중간 숫자만 놓고 코드를 짰을땐 1. 1~9 까지의 숫자 배열을 만들어두고 이를 활용하여 숫자가 시작하는 위치를 파악한다. 2. 숫자가 나오는 처음 지점부터 숫자가 끝나는 지점까지만 String으로 묶어서 다시 배열화해준다. 3. 그 후 값들을 Int로 바꾸고 현재 위치를 기준으로 minumum value를 찾아 해당 위치를 기록하여 다시 배열화해준다. 4. 이 배열에 나와있는 번호 순서대로 새로운 배열에 값들을 정렬해주면 된다. 라고 생각했는데 그 문제가 아니었다 ^^ 앞 부분의 대문자나 알파벳 순서.. 등을 고려해야했다! 그렇게 오늘도 등장한 모범답안.....