전체 글

성장하는 삶을 목표로 삼고 있습니다. 백준 알고리즘 문제 풀이, 개발, 자기개발과 독서에 관해 비주기적으로 업로드 합니다.
난이도: Lv.3유형: union-find해결 여부: 틀림내가 생각했던 아이디어/큰 가닥update와 merge, unmerge를 생각했을때 그냥 단순 주소에 값 저장하는것이 아니라 어디와 같은값인지 포인터처럼 묶이는 위치를 저장해야함. 근데 묶일때의 우열은 없음. 그러니까 누가 대장이어서 덮어씌워지는건 아님. 아니면 그거 자체를 내가 순서 붙여서 어디에 맞출지 정할수 있긴함. 그래서 자료구조적인 접근이 필요. 아마 딕셔너리 쓸듯.문자이름: 좌표 배열 일케 저장하면 update는 편하긴 함. 그냥 배열이랑 같이써도 공간복잡도는 크게 증가하지 않음. 둘 동시저장 및 반영 고려문제는 merge, unmerge인데 마찬가지로 이차원배열만들어서 병합당한놈만 자기값이 아니라 포인터처럼 남의 좌표 가르키게?그래서 ..
난이도: Lv.3유형:백트래킹해결 여부: 오답내가 생각했던 아이디어/큰 가닥수레는 2개. 일단 각자 BFS 돌려보고, 만약 동시에 있는 칸 생기면 우회하는 식으로그러면 정해야할듯. 빨강우선법, 파랑우선법. 이렇게 해서 빨강우선법이면 빨강 경로를 정하고 파랑입장에서 빨강의 경로는 움직이는 벽이다. 그렇게 간주하고 파랑으로 맞추는건? 근데 동일 횟수여도 서로 배려해서 간다면 서로 충돌 아난고 갈 수 있다. 즉 BFS 안에서도 경로 여러갈래 나오고 그안에서 무얼 선택하느냐에 따라 효율이 달라질 수 있다. 그리고 정지가 금지되는구나. 무조건 움직이긴 해야되네.걍 AI가 조언해준대로 2개를 동시에 움직이는 모든경우의수를 해야할듯. 미로도 작고.오답 이유메인루프에서 꺼낸값을 기존변수로 안쓰고 있었음.리스트 복사가..
·Algorithm/BFS,DFS
난이도: Lv.3유형: BFS해결 여부: 답봄내가 생각했던 아이디어/큰 가닥결국 어떤걸먼저할지 순서가 결과에 영향을 준다근데 그 순서가 정해지면 얼마나 걸리는지 자체는 빠르게 결정남 그러면 모든 순서 다 해보면? 카드 종류 6개니까 6! = 720 쌉가능일거 같은데 그래서 현재 커서위치랑, 뭘제거할지를 받아서 함수화 시키고, 키조작횟수를 return. 이걸 permutations 넣고 돌려서 최솟값?오답 이유발상은 맞았는데 구현 너무 복잡해질거 같아서 답봄 해답안에서 정적인 계산이 아니라 한번더 돌려줘야 한다. #기억할 문법 pos.setdefault(board[i][j], []).append((i, j)) # dict에서 키가 없을때 빈리스트로 초기화하고 값을 넣는다.#내 오답코드def solution..
·Algorithm/DP
난이도: Lv.3유형: DP해결 여부: 틀림내가 생각했던 아이디어/큰 가닥-전에 했던 이진탐색과 비슷한 문제인듯 싶음-이진탐색이면, 결국 이 시간으로 -> 풀이가 각각 가능한지를 따져봐야함.-가능은 할듯, 문제는 문제를 푸는데도 시간이 걸린다는 것. 근데 결국 다 푸는게 목적인데, 시간 안걸린다고 가정하고, 나중에 결과에다가 푼 시간 다 더하면 되지 않을까? 즉 시간 소모 자원 자체는 알고력, 코딩력 올리는데만 쓰고 나중에 다 더하기-ㅇㅋ 문제 풀이로 능력치가 올라가 문제를 푸는 연쇄작용을 해결해야 할듯. 연쇄 한번이라도 멈추면 계속하고, 안되면 멈춰서 False 뱉는식으로라고 했다가 AI가 아니라고 해서 DP로 고쳐잡음.-알고력과 코딩력의 도달해야하는 맥스값이 정해져 있음-문제를 푸는 순서는 중요하지만..
난이도: Lv.2유형: 이진탐색해결 여부: 피드백 받아서 해결내가 생각했던 아이디어/큰 가닥금, 은 분리해서 생각하고, 더 길지 않은 쪽이 여유가 생기면, 일부 트럭이 날라주는? DP 문제같긴한데.. 도시개수는 많을 수 있는데, 이제 금이랑 은 2개만 충족하면 되니, 금, 은을 2차원 배열 DP로? DP[금양][은양] = 시간 이런식으로, 그래서 나라 하나 추가할때마다 이제 갱신하는 식으로. 새로운 나라에서는 더하는게 아니라 값이 더 작을때 갱신하는 식으로? 이 외에 다른 접근이 생각이 안난다.. 일단 해봐야 될듯, 근데 a랑 b둘다 10^9 까지 오는데 메모리 초과 안날라나.근데 값을 갱신하는 것 뿐만아니라 보고 더하거나 하는 부분도 있어야 되긴함. 당연히 더하면 더 커지니까 그대로 더하는게 아니라 이..
난이도: Lv.2유형: 스택해결 여부: 오답내가 생각했던 아이디어/큰 가닥일단 처음에는 결국 자릿수는 정해져 있으니, 앞쪽에 큰 수가 오는 경우의수를 따져서, 가장 크게될때까지 턴을 쓰고, 남은 턴을 다음 자릿수에 쓰고.. 반복하는줄 알았다.그런데 관찰하다 보니, 그냥 그리디 방식으로 매번 하나씩 없애가며 새로운 값 대입해도 되는것 같았다.그래서 그리디로 for문 2중으로 돌리는 식으로 했는데 런타임에러가 났다. 오답 이유오답 원인은 int() 변환의 자릿수 제한이다. 4300자리 넘는 문자열을 한번에 통과할 수 없다. 게다가 for문 쓰는 n^2으로는 어차피 안된다. 해답이렇게 인접한 것 영향받아서 그리디로 브루프포스될때 스택문제라고 생각하면 된다.스택으로 하나씩 쌓으면서 이걸 넣을지, 이전걸 뺄지 결..
·Algorithm/String
난이도: Lv.2유형: 문자열해결 여부: 정답내가 생각했던 아이디어/큰 가닥결국 마지막에 바꾼 닉네임으로 적용되니 딕셔너리에 계속 저장해놓았다가 일괄적으로 바꾸면 되겠다고 생각했다. 해답굳이 마지막에 if 문으로 가공할 필요 없음 return [f"{nickname[uid]}{msg[action]}" for action, uid in logs] 이런식으로 리스트 컴프리헨션으로 리턴해주는게 짧고 간결하다.딕셔너리 자체를 분기로 쓸 수 있다. if문 없이 key에 따라 dictionary에 적힌 문구로 로그 남기는 식으로#기억할 문법 action, uid, *name = r.split() 이런식으로 하면 *은 다 리스트로 들어가기 때문에 값이 없으면 빈리스트 여러개여도 리스트로 들어가서 오류가 안나고 잘 처..
·Algorithm/String
난이도: Lv.2유형: 비트마스킹해결 여부: 오답내가 생각했던 아이디어/큰 가닥숫자를 이진수로 바꾸는데 있어서 규칙성이 있다고 생각하고, 그걸 일일히 문자열로 바꾸고 변환하려고 했다.오답 이유해당 규칙이 잘못되었다해답그냥 for문돌려도 풀린다.#기억할 문법 #내 오답코드def solution(n): answer=0 if n=='1': return 2 target=bin(n)[2:] if len(target)==target.count('1'): tempanswer='10'+target[1:] answer=tempanswer else: pos=target[:len(target)-1].rfind('0') # #뒤에..
걍판자
걍판자의 개발과 자기개발 일지