하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문임의의 노드에서 시작하여 최대한 깊숙이 들어가서 노트를 방문한 후,다시 돌아가 다른 경로를 탐색하는 알리고리즘이다.시작 노드를 스택에 삽입 방문 처리스택의 최상단 노드에 방문 방문하지 않은 인접 노드가 있
4 5 11 21 31 42 43 41 2 4 31 2 3 4dfs코드 부터 분석해보자.시작 노드 1 dfs(1)1 노드는 방문처리하고 printfor문으로 1234노드를 전부 검사한다. 이 중 방문을 안했고 data에 들어가있는 노드를 선택해 재귀적으로 dfs를 불러
https://www.acmicpc.net/problem/2178미로에 좌표를 부여한다.1 (0,0) 0 1 1 1 11 (0,1) 0 1 0 1 01 (0,2) 0 1 0 1 11 (0,3) 1 1 0 1 1(0,0)에서 시작하는데 동서남북으로 1이 있는 칸
이전에 풀었던 미로탐색과 비슷하면서 조금 다른 문제였다. for i in range(n): for j in range(n): if visitedi == 0 and datai == 1: dfs(i, j) apt.
문제철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가
단지 세기? 와 그냥 똑같은 문제이다.우선 런타임 에러 (RecursionError)가 계속 떠서 그부분이 좀 힘들엇다.RecursionError는 재귀와 관련된 에러입니다. 가장 많이 발생하는 이유는 Python이 정한 최대 재귀 깊이보다 재귀의 깊이가 더 깊어질 때
그리디 알고리즘은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미한다.그리디 해법은 정당성 분석이 중요하다 -> 단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 보장 할 수 있는지 검토한다. 탐욕적으로 현재 상황에서 가장 좋은 방법을 고르고 그 과
만들 수 있는 그룹의 최대값을 구해야한다 -> 공포도가 작은순으로 그룹을 만들어야한다.모든 모험가를 특정한 그룹에 넣을 필요가 없다.가장 낮은 공포도부터 넣어주며 그 공포도와 그룹의 사람 숫자를 비교해 그룹의 수를 더해준다.왼쪽에 있는게 0 또는 1인경우왼쪽부터 차레로
아이디어를 생각하는것이 중요한 문제인것같다.1 1 1 1출력 5\-> 다 더한거에서 +1이 최소값조건 왼쪽부터 차례로 더하는데 오른쪽의 값이 왼쪽에 더한 값보다 작거나 같다.1 2 3 4출력 11\-> 다 더한거에서 +1이 최소값조건 왼쪽부터 차례로 더하는데 오른쪽의
P1 = 3, P2 = 1, P3 = 4, P4 = 3, P5 = 2 인 경우를 생각해보자. 1, 2, 3, 4, 5 순서로 줄을 선다면, 1번 사람은 3분만에 돈을 뽑을 수 있다. 2번 사람은 1번 사람이 돈을 뽑을 때 까지 기다려야 하기 때문에, 3+1 = 4분이
55-50+40 에서 가장 최소가 되도록 괄호를 치면 55-(50+40)이다. -> 우선 -를 기준으로 나눠준다음 - 뒤에 있는 숫자를 모두 합치면 된다.회의를 끝나는 시간을 기준으로만 정렬을 해주면 된다고 생각해 처음에는 data.sort(key=lambda x: (
https://programmers.co.kr/learn/courses/30/lessons/42891저번에 못푼 문제 풀기..아이디어음식양이 적은순으로 정렬하면 가장 작은 음식량을 기준으로 한줄씩 없앨수잇다. 음식양과 인텍스가 같이 움직일 수 있도록 설정해줘야
구현이란, 머리속에 있는 알고리즘을 소스코드로 바꾸는 과정이다.풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제코드가 길어지거나 문자열 실수연산을 처리해야하거나 적절한 라이브러리를 사용할시 빨리 풀 수 있는 문제이다.수평으로 두 칸 이동 수직 한 칸수직 두 칸
alpha = 0 \* 26 사용햇던 알파벳인지 검사하는 배열사용하면 1로 바꿔줌alphaint(ord(last)) - 97 = 1for 문으로 바로 전에 지나간 문자를 last로 둔다. last = aj 그래서 last와 현재 문자를 비교해
완전 지각...죄송합ㄴ다.....프젝때문에 하루하루 해커톤 하는것같다;;알파벳 숫자 나눠서 list append 후 정렬다시 프린트set 차집합 이용안읽어진다....내일이나 복습시간때 하겟습니다...
1 집 2 치킨 좌표를 따로 받음combinations(two, m) 치킨집중 m 개 조합아무리 봐도 모르겠음...실버4인데 아마 다른 언어는 스택을 구현해서 어려운건가..?파이썬은 스택이 list로 내장함수가 존재해 편하게 풀었다.
계속 봐도 모르겠다 두 문제 모두 그냥 다 확인해보는 식으로 하면 된다.
https://www.acmicpc.net/problem/3190이전 게임개발 문제를 참고했다.주석으로 설명을 달았으니 풀이과정은 생략하겠다...
탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.대표적인 그래프 탐색 알고리즘으로는 DFS 와 BFS가 있다.먼저 들어 온 데이터가 나중에 나가는 형식 (선입후출)입구와 출구가 동일한 형태 시각화삽입과 삭제 연산으로 구성삽입(5) (2) (3) (
책 코드 도움을 받아 풀었다복습시간 나에게 맡긴다...어떤 문제일때 BFS쓰는지 DFS 쓰는지 그 부분이 가장 어려운것같다.
일단...하...너무 어렵다..
상하좌우 움직이는 문제 많이 나오는데 패턴이 똑같아서 한번만 제대로 익히면 좋은것같다.카카오 문제는 문제가 잘 이해가 안간다 왜 난이도 1인것..?bfs dfs 코드를 안보고 짜는건 아직 안된다....
분석 좀 해봐야겠다
DFS/BFS 못푼 문제연구소연산자 끼워넣기감시피하기블록이동하기
정렬이란 데이터를 특정한 기준에 따라 순서대로 나열하는 것을 말합니다.\-일반적으로 문제 상황에 따라서 적절한 정렬 알고리즘이 공식처럼 사용된다.정렬 알고리즘을 통해 정렬하면 이진탐색이 가능해진다.처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데
흠 정렬문제는 그냥 다 정렬 라이브러리 쓰면 되는것아닌가..?!어려운 문제를 아직 안풀어서 잘 모르겟다...
국영수 안테나 단어정렬
일정 범위가 존재하기 때문에 계수정렬을 사용했다.쉽다고 생각했는데 안풀린다...처음에 permutations 이용했더니 시간초과가 나왔다.str을 내림차순으로 정렬하면20,2,10,1이다.하지만 최대값은 2 20 1 10 이기 때문에정렬의 조건을 하나 더 해줘야한다.고
문제만 풀고 글을 안올렸네요...상상으로 글을 올렸나 분명 올렸다고 생각했는데 죄송합니다😭😭처음에 연습겸 선택정렬과 퀵정렬을 작성햇는데 시간초과가 나왔다.그래서 그냥 sort와 sys 이용했다.이거는 메모리 초과가 나왔다문제에 조건이 있었는데 10000보다 작거나
처음에 이런식으로 작성해 정렬하고 작은값부터 더해서 같이 더해주는식으로 코드를 짰다. 단순히 테스트값 10 20 30만 보면 맞지만 생각해보니 10 10 10 10 일경우 내 코드로 풀게되면 10 + 10 = 2020+ 10=3030+10=40 이런식으로 진행된다.하지
이진 탐색은 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정함시작점 : 0 끝점 : 9 중간점 : 4중간점 (값 8 인덱스 4) 기준으로 우리가 찾고자하는 값 4 크기 때문에중간점 오른쪽 데이터는 볼 필요 없음다시 왼쪽 데이터 리스트중시작점 : 0 중간점 : 1 끝
책에 있는 다른 풀이인데 파이썬스러운 코드인것같다시간제한이 O(logN)이 있는 문제였다.for 문 하나만으로도 시간 복잡도가 O(n)이 되기 때문에 반목문 없이 코드를 짜야해야해서 어려웠다.1\. 문제에서 값이 인덱스와 동일한 원소 하나밖에 없다는걸 전제를 한다. -
이진탐색 나랑 안맞는다.왜 a+mid를 더해서 비교해주는지 이해가 안간다....
못하겠다...
a가 4일때 2는 4의 제곱근이라고 한다. 즉 a를 제곱해서 b가 나오면 a는 b의 제곱근이라고 한다.제곱근을 구하는 방법인데 mid를 2로 나눈값을 두고 그 값을 제곱해서 n보다 크면 end값을 mid-1로 작으면 start값ㅇ,ㄹ mid+1로 바꾼다.헷갈리는 부분은
2352.py 반도체 설계 LIS(Longest Increasing Subsequence) 알고리즘이라고 한다. 솔직히 읽어도 모르겠다. 문제를 보면서 천천히 하나씩 이어가보자. 1 -> 4 2 -> 2 연결선이 4 꼬이기 때문에 1 -> 4는 연결이 안된다. 3
다이나믹 프로그래밍은 동적 계획법이라고도 부릅니다.다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법입니다.이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 합니다.다이나믹 프로그래밍의 구현은
이런 비슷한 문제를 그리디에서 푼것같아서 찾아보니 1이 될때까지 라는 비슷한 문제가 있었다.그렇다면 다이나믹 프로그래밍으로 푼 문제와 그리디로 푼 문제와 차이점이 뭔지 찾아보니 그리디의 경우 무조건 나누어지는 값으로 나누고 그 값이 최적의 값을 보장해주는 문제여야 한다
3가지 경우1) 첫번째 줄 -> 왼쪽이랑 왼쪽 위에서2) 마지막 줄 -> 왼쪽이랑 왼쪽 밑에서3) 나머지 -> 왼쪽, 왼쪽 밑, 왼쪽 위대충 계산해보면서 규칙 찾아갔다.시간이 안넘으면 dpj = max(dpj + 1, pj + dp\[j + tj])
병사 배치하기 18353 못생긴수 편집거리
9095 1149 2156
최단 경로 알고리즘 최단경로 문제 최단 경로 알고리즘은 가장 짧은 경로를 찾는 알고리즘을 의미한다. 다양한 문제 상황 한 지점에서 다른 한 지점까지의 최단 경로 한 지점에서 다른 모든 지점까지의 최단 경로 모든 지점에서 다른 모든 지점까지의 최단 경로 각
1번 노드에서 5번 노드를 거쳐 4번노드로 가는 문제이다.문제만 보면 다익스트라 플로이드나 아무렇게 풀어도 상관없지만 시간복잡도가 널널하기 때문에 더 구현하기 쉬운 플로이드 워셜 알고리즘을 이용해서 구현했다.거리 그래프를 만드는데 자기자신으로 가는것과 1-2(1->2
한 도시에서 다른 도시까지의 최단경로를 구해 그 중 가장 먼 거리를 구하는 문제이다.시간복잡도가 여유롭지 않기 때문에 다익스트라 알고리즘을 이용해야한다.
플로이드 워셜은grapha=min(grapha, grapha+graphk)이 점화식만 이해한다면 구현하기가 쉽다.a -> b로 가는 거리를 a에서 b로 바로가는 루트 1과 a에서 어떤 노드를 거쳐 b로 가는 루트 2를 비교해 최단경로를 구하는 것이다.
좀 많이 틀려서 오래걸렸다.distance 를 2차원 배열, 양방향, INF값을 크게 설정해야 맞는다
서로소 집합이란?공통 원소가 없는 두 집합을 의미두개의 집합으로 나누어짐왼쪽과 오른쪽 집합은 서로소 집합 -> 연결성을 통해 알아냄책 291p
자물쇠의 크기를 늘린다.자물쇠의 크기 \* 3로 늘려 가운데에 자물쇠를 위치 시킨다.1,자물쇠 \* 2 만큼 이동하면서 회전 (0도 90도 180도 270도) 진행해 자물쇠 + 키를 더해 합이 1인지 check한다.아니면 원래 자물쇠값으로 돌아간다.n3으로 늘린 이류와
처음에는 모양에(ㅣㅡㅏㄹ..) 따라 나눠서 구하려고 했는데 왕실의 나이트 문제가 생각나 19가지 경우를 list안에 넣어 구해보았다.
1052는 처음에 2로 나누고 나머지랑 몫을 이용해서 계산하는 식으로 생각하고 풀었는데 찾아보니 이진수로 푼 선생님들이 많더라,,,,아이디어만 생각하면 참 깔끔한 코드로 풀 수 있는 문제같다.
1\. Time, index 저장Time 정렬가장 적은 time 접시를 배열의 길이만큼 곱함위의 값을 k와 비교해 크거나 같으면 그냥 빼주고 작으면 k를 접시의 개수로 나눈 나머지를 구해 index 를 구한다.Ex)
파이썬으로 알고리즘 공부하다 자바로 바꿀려고 하니 정말.....(말잇못)2개씩만 짝지음1\. 음수인 경우 1) 홀수 \-5 -3 -2 -> -5 -3 = 15 i) 0이 있는 경우 (0추가) 15+(-20) =0 ii) 0 없는 경우 (1추가) 15+(-2
(2,3) 뽑는다면 now0=0(3,3) 뽑는다면 now1=1depth=2이므로 종료temp에 chicken(0) chicken(1) -> result이런식으로 반복된다.
1 5 6 10 -> 1 5 6 10 13 17 18 22
알고리즘을 다시 꾸준하게 공부중이다.알고리즘을 공부하면서 알고리즘 문제를 많이 푸는것도 중요하지만 남한테 설명할 수 있을만큼 문제를 완전히 내 것으로 만드는것도 중요함을 느끼고 있다.그래서 다시 열심히 블로그를 작성해볼까 한다.이 문제는 DFS를 이용하여 풀었다.이 문
자바 알고리즘 👍 는 몇 가지 방법 중 속도가 좋은 방법에 표시하였습니다. 문자열 출력 System.out.print(); System.out.println(); -> 한줄 띄움 입력 1. Scanner 2. BufferReader + StringTokenize
\-> 보통 단순하게 최대값을 구하지 않기 때문에 난 잘 안이용함최대값을 가진 인덱스나 앞과 뒤를 비교해서 누가 큰지 구하는 등 문제에서는 max 변수를 이용해 구한다.
정렬과 이진탐색이 모두 필요한 문제이다.배열이 주어지고 두 값을 더해서 0에 가까운 값을 출력하는 문제이다.두 값을 더해서 0과 가까운 값을 만들어내기 위해서정렬을 한 후 가장 작은 값과 가장 큰 값을 차례로 더해가야한다.여기서\-100 -30 10 25 30이라면\-
https://school.programmers.co.kr/learn/courses/30/lessons/428391\. String을 순열을 통해 여러 조합의 숫자로 만들어줘야함"17" -> 1,7,17,712\. 만든 숫자를 소수체크를 해야함isPrime 함
처음에는 각 alpha를 배열에 넣어 course와 같은 수를 가진 char값을 str로 만들어 반환해줬다. 당연 다 틀려버렸고,,,문제를 다시 읽어보니음식의 조합을 이용해서 구해야했다.문제를 푼 과정을 내열해보면1\. 제한사항 4-1 배열의 각 원소에 저장된 문자열
https://school.programmers.co.kr/learn/courses/30/lessons/68645규칙이 보일듯 안보여서 어려웠던 문제다.보면 num이 차례대로 가로->세로->대각선으로 3가지 경우로 반복된다.가로의 경우 x좌표가 증가하고 세로는
https://school.programmers.co.kr/learn/courses/30/lessons/17679문제 파악 -> 빡 구현1\. 2x2 같은 블록 찾기2x2 모양이 고정되어 있기 때문에 2중 반복문으로 현재위치(x,y)와 (x+1,y)(x,y+1
https://school.programmers.co.kr/learn/courses/30/lessons/129781번 마을부터 시작해서 각 마을의 최단경로를 구해 K(갈 수 있는 배달길이) 보다 작은 마을의 개수를 구하는 문제이다.전형적인 다익스트라 문제이며
https://school.programmers.co.kr/learn/courses/30/lessons/67257\+-\* 연산이 있고 가장 큰 값이 나오도록 연산 우선순위를 정하는 문제이다.100-200300-500+20가 있다면\-+ 순으로 하여 100-(
2문제 모두 DFS 알고리즘 문제로 푸는 방식이 비슷하여 가져와봤다. https://www.acmicpc.net/problem/14502해야할 일1\. 벽 3개 세우기2\. 벽 완료하면 바이러스 퍼지게 실험3\. 바이러스 실험 완료하면 점수 도출해서 최대값 찾
https://school.programmers.co.kr/learn/courses/30/lessons/42579레벨 3이지만 어려운 문제는 아니였다.1\. 노래는 고유 번호와 장르 재생 시간을 가진다.2\. 장르 별로 가장 많이 재생된 노래를 2개 씩 모아야
전형적인 그리디 문제입니다.N: 200,000,000 이하의 자연수로 효율성 테스트도 신경써줘야ㅕ하는 문제입니다.1\. 기지국 설치를 하면 2w+1만큼 전파 터짐 w가 2면 --기지국-- 양쪽으로 w만큼 전파가 터지고 +1은 기지국 설치 위치2\. 최소의 기지국으로 전
전형적인 DP 문제입니다. 어렵진 않은데 DP말고 다른 방식으로 풀면 효율성 테스트에서 시간초과가 나와 level 3 에 선정된것같습니다.집에서 오른쪽 아래로만 움직여 학교까지 가는 최단 거리를 구해야합니다. (중간에 장애물이 존재합니다.)2차원 배열을 만들어 장애물은