방문을 환영합니다.

새 컨텐츠를 확인해 보세요!

  • [Flutter] Provider context.selector ListView 안에서 직접 사용 불가 문제

    [Flutter] Provider context.selector ListView 안에서 직접 사용 불가 문제

    사전지식 provider의 context.selector(....)는 selector에 등록된 변수의 값이 바뀌는지 tracking하고, 값이 바뀌면 해당 위젯을 rebuild하는 메소드이다. context.watch()도 있지만 wathc는 해당 값 말고 같은 changeNotifier 안에 등록된 다른 값이 바뀌어도 rebuild가 일어나 selector를 사용하면 불필요한 rebuild를 줄일 수 있다. 문제상황 ════════ Exception caught by widgets library ═══════════════════════════════════ The following assertion was thrown building: Tried to use context.select inside a..

  • [WEB] 스도쿠 풀이 프로그램 #4

    [WEB] 스도쿠 풀이 프로그램 #4

    이전 글에서 python으로 만들었던 스도쿠 풀이 프로그램을 누구나 바로 사용할 수 있도록 html, css, js로 다시 만들어보았다. 간단하게 알고리즘을 설명하자면 입력받은 스도쿠가 해결가능한지 확인한다. 재귀함수로 구현한 백트래킹 알고리즘을 사용해 입력받은 스도쿠의 해를 찾는다. 만약 해가 있다면, 밑에 출력한다. 해를 찾을 수 없다면, 'Unable To solve Sudoku'를 출력한다. 소스코드 참고 - https://github.com/siejwkaodj/sudoku_solver_online Sudoku Solver Made by Hansj 설명 빈 칸에 스도쿠에 적혀있는 1-9 사이의 숫자를 입력하세요. 0을 입력하면 다음 칸으로 넘어갑니다. 파일 업로드는 .csv 또는 .txt파일만 가..

  • [C++] 파일 입출력 - dfs [2]

    [C++] 파일 입출력 - dfs [2]

    저번 글에 이어 이번 글에서는 그래프를 읽어온 결과를 바탕으로 그래프 상에서 dfs를 해보겠다. 0. 그래프 구조 먼저, 저번 글에서 사용한 그래프 구조를 직접 그리면 다음과 같다. 1. dfs 코드 dfs는 Depth-First-Search의 약자로 현재 정점에서 다음 정점으로 갈 수 있는 경우, 탐색을 계속하며 다음 정점이 없는 경우에는 부모 정점으로 돌아가 다시 갈 수 있는 정점가 있는지 판단한다. 다음 정점이 있는 경우 계속해서 탐색을 하기 때문에 트리에서 탐색할 경우, 루트 노드에서 계속해서 높이를 내려가면서 탐색을 하므로 dfs라는 이름이 붙었다. 코드 전반은 다음과 같다. int dfs(vector &graph, vector& visited, int n){ cout

  • [C++] 파일 입출력 - 텍스트 파일 읽기 [1]

    [C++] 파일 입출력 - 텍스트 파일 읽기 [1]

    이 글에서는 fstream 라이브러리를 이용한(C++11 이상 버전 권장, 버퍼 객체 bool 타입으로 변환 가능해서) 파일 입출력 예제를 다뤄보겠다. 수업에서 배운 dfs, bfs, 다익스트라 알고리즘 등을 복습할 겸 C++로 코드를 짜보았다. 1. include 먼저 기본 입출력에 필요한 iostream, 그래프 정보를 저장하는 데 쓸 이차원 배열을 동적으로 생성하기 위한 vector, 파일 입출력을 위한 fstream 라이브러리를 include 해온다. #include #include #include using namespace std; *std 네임스페이스를 미리 선언했다. 이렇게 되면 원래는 std::fstream 형인 fstream을 그냥 fstream으로 사용할 수 있다. 2. 변수들과 파일..

  • [JAVA] java string.split() 메소드 - ".", "\" 으로 split하기

    java에서는 String 클래스에 문자열을 특정 문자열을 인수로 받아 쪼개주는 메서드인 .split()이 존재한다. 하지만, "." 이나 "\" 같은 예약어들은 함부로 사용할 수 없다. 그럴 땐 다음과 같은 방법을 이용할 수 있다. 1. "." 으로 split() 하기 .split("//."); .split("[.]"); 2. "\" 으로 split() 하기 .split("////"); 참고 블로그 : https://mousevm.tistory.com/224 String.split( ) 함수에서 구분자로 역슬래시("\") 사용하기. 오늘도 역시 삽질 끝에 알아낸 소중한 하나의 정보를 기록합니다. ㅋㅋ 오늘은 자바의 String.split( ) 함수에서 구분자로 역슬래시("\")를 사용해서 문자열을 분리..

  • [JAVA] eclipse swing 모듈 설정

    [JAVA] eclipse swing 모듈 설정

    자바에서 스윙 라이브러리를 사용하려고 다음과 같이 import시 오류가 나는 상황이 있었을 것이다. import javax.swing.*; 이때, java 11 이후로는 java.base 모듈만 기본으로 포함하므로, 그 이외의 다른 모듈들을 사용하기 위해서는 따로 불러오기가 필요하다. 따라서 module-info.java 파일에 다음과 같이 작성해준다. module { requires java.desktop; } 예시) 참고 블로그 : https://daily-life-of-bsh.tistory.com/129

  • [Algo] 다익스트라 (dijkstra) 알고리즘

    [Algo] 다익스트라 (dijkstra) 알고리즘

    1. 서론 다익스트라 알고리즘이란, 그래프 상에서 한 정점에서 다른 (모든) 정점으로의 최단경로를 구하기 위해 사용되는 알고리즘이다. 인접 리스트와 우선순위 큐를 이용해 손쉽게 구현할 수 있다는 장점이 있어 많은 사람들이 사용한다. 2. 설명 먼저, 다음과 같은 그래프가 있다고 가정하자. 다익스트라 알고리즘은 먼저 시작점 자신의 거리를 0으로 두고 다른 갈 수 있는 모든 점들의 최단거리값 (dist[])를 업데이트한다. 업데이트시 만약 [현재 노드의 cost + 현재 가리키는 노드로 가는 edge의 cost] 값이 가리키는 노드의 dist값보다 작다면, dist를 업데이트한다. 그 다음, 방문하지 않은 다른 모든 점들중 가장 dist값이 작은 노드를 시작점으로 잡고, 다시 dist를 업데이트한다. 이를 ..

  • [Quick Note] swap 함수를 구현하는 세 가지 방법 (C++)

    [Quick Note] swap 함수를 구현하는 세 가지 방법 (C++)

    1. 변수 한 개를 추가로 생성한다. void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp; return; } 2. xor 연산을 사용한다. void swap(int *a, int *b){ *a ^= *b; *b ^= *a; *a ^= *b; return; } 3. 덧셈 연산을 사용한다. void swap(int *a, int *b){ *a = *a + *b; *b = *a - *b; *a = *a - *b; return; } // 또는 더 간단하게 void swap(int *a, int *b){ *a += *b; *b = *a - *b; *a -= *b; return; } 1. 방법은 간편하지만 추가로 변수를 생성해야 한다는 단점이 존재하고 (메모리 ..

  • [Git] github remote 저장소 변경하기

    [Git] github remote 저장소 변경하기

    참고 링크 : https://gist.github.com/480/4681b67d2a906db8c6c1321cc678f05f github 리모트 리포지토리 변경하기 github 리모트 리포지토리 변경하기. GitHub Gist: instantly share code, notes, and snippets. gist.github.com 1. 기존 repository pull/push 하기 git pull git add . git commit -m "clean push" git push 2. 기존 repository remote 제거 git remote remove origin 3. 새 repository remote 추가 git remote add origin [깃 주소]

  • [BOJ] 1912 - 연속합 (C++)

    [BOJ] 1912 - 연속합 (C++)

    1. 문제 https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 양의 정수 n(1 ≤ n ≤ 100,000)과 n개의 원소로 이루어진 수열 An이 주어진다. 이때, An에서 가장 큰 구간합을 구하여라. 2. 해결 방법 1. Brute Force 먼저 가장 간단한 방법은, Brute Force 방식으로 크기 n의 int 배열을 만들어 i번째 자리에서 1~i-1번째 자리부터에서의 합을 구해 O(n^2)(1~i에서 O(n), 이를 1번째부터 i-1까지 반복하므로 O..

  • [BOJ] 1822 - 차집합 (C++)

    [BOJ] 1822 - 차집합 (C++)

    1. 문제 https://www.acmicpc.net/problem/1822 1822번: 차집합 첫째 줄에는 집합 A의 원소의 개수 n(A)와 집합 B의 원소의 개수 n(B)가 빈 칸을 사이에 두고 주어진다. (1 ≤ n(A), n(B) ≤ 500,000)이 주어진다. 둘째 줄에는 집합 A의 원소가, 셋째 줄에는 집합 B의 원소 www.acmicpc.net 집합 A에는 속하지만, B에는 속하지 않는 원소들의 개수와 원소들을 모두 출력하는 문제이다. 집합에서 A - B (차집합)의 개념이 등장한다. 2. 풀이 방법 배열이나 리스트 등을 사용하면 해당 자료형 안에 특정 원소가 있는지 확인하려면 O(1)의 시간이 걸리기에, 접근하는데 시간이 O(1)이 걸리는 맵 자료형을 이용하여 문제를 해결했다. 먼저 A와 ..

  • [BOJ] 11053 - 가장 긴 증가하는 부분 수열 (LIS; C++)

    [BOJ] 11053 - 가장 긴 증가하는 부분 수열 (LIS; C++)

    1. 문제 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 길이가 n일 수열이 주어질 때, 이 수열에서 가장 긴 증가하는 부분 수열의 길이(연속일 필요는 없지만 증가해야 함)를 구하면 되는 문제이다. 2. 풀이 방법 LIS 문제의 해결법은 이 블로그에 잘 나와 있다. https://seungkwan.tistory.com/8 가장 긴 증가하는 부분 수열 (Longest..

  • [BOJ] 19566 - 수열의 구간 평균 (C++)

    [BOJ] 19566 - 수열의 구간 평균 (C++)

    1. 문제 https://www.acmicpc.net/problem/19566 19566번: 수열의 구간 평균 길이가 $N$인 수열 $A_1, A_2, \cdots, A_N$이 주어진다. 구간에 있는 모든 수들의 평균이 정확히 $K$인 구간의 개수를 구해 보자. www.acmicpc.net 길이가 n인 수열이 주어질 때, 이 수열에서 평균이 k인 구간의 개수를 구하면 되는 문제이다. 2. 해결 방법 1. 먼저 평균의 의미를 다시 생각해보자. 평균 = 원소들의 합 / 원소들의 개수이다. 양변에 원소들의 개수를 곱하면, 다음과 같이 쓸 수 있다. 구간합 = 평균 * 구간길이 이다. 즉, 구간합을 원소들의 개수로 나눠 이를 평균과 비교할 것이 아니라, 구간합이 구간길이 * 평균과 같은지만 비교해주면 된다는 것..

  • [BOJ] AC그룹 모의대회2 풀이 - 1

    [BOJ] AC그룹 모의대회2 풀이 - 1

    - 목차 1. 설명 2. 문제 리스트 3. 각 문제 풀이 및 개선할 점, 코드 1. 설명 22-10-30 21:00:00~ 23:00:00 2시간동안 진행한 모의대회 2 관련 풀이 정리 https://www.acmicpc.net/group/practice/view/15679/17 로그인 www.acmicpc.net 2. 문제 리스트 A - 제곱수의 합 (solved) https://www.acmicpc.net/problem/1699 B - 골드바흐의 추측 (solved) https://www.acmicpc.net/problem/6588 C - 기상청 인턴 신현수 (solved) https://www.acmicpc.net/problem/2435 D - 수열의 구간 평균 https://www.acmicpc...

  • [BOJ] 1012 - 유기농 배추 (C++)

    [BOJ] 1012 - 유기농 배추 (C++)

    1. 문제 https://www.acmicpc.net/problem/1012 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 문제에서는 밭의 가로, 세로 크기와 심어진 배추의 개수, 각 배추의 위치가 주어진다. 이때 배추들을 건강하게 키우기 위한 최소 배추흰지렁이 개수를 구하면 되는 문제이다. 2. 해결 아이디어 dfs, bfs 등을 이용하여 쉽게 해결할 수 있는 문제이다. 다만 이번 문제를 해결하면서 작은 문제를 마주쳐 그것에 대해 기록하려고 글을 쓴다... 3. 개선할 점 코드에서 전역으로 밭(field), visit..

  • [Baekjoon] 6549, 1725 - 히스토그램에서 가장 큰 직사각형(C++)

    [Baekjoon] 6549, 1725 - 히스토그램에서 가장 큰 직사각형(C++)

    1. 문제 https://www.acmicpc.net/problem/6549 6549번: 히스토그램에서 가장 큰 직사각형 입력은 테스트 케이스 여러 개로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 직사각형의 수 n이 가장 처음으로 주어진다. (1 ≤ n ≤ 100,000) 그 다음 n개의 정수 h1, ..., hn (0 ≤ hi ≤ www.acmicpc.net https://www.acmicpc.net/problem/1725 1725번: 히스토그램 첫 행에는 N (1 ≤ N ≤ 100,000) 이 주어진다. N은 히스토그램의 가로 칸의 수이다. 다음 N 행에 걸쳐 각 칸의 높이가 왼쪽에서부터 차례대로 주어진다. 각 칸의 높이는 1,000,000,000보다 작거나 같은 www.acmicp..

  • [Baekjoon] 1107 - 리모컨 (C++)

    [Baekjoon] 1107 - 리모컨 (C++)

    1. 문제 문제 수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장 났다. 리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고 있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대만큼 있다. 수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장 났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오. 수빈이가 지금 보고 있는 채널은 100번이다. 입력 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 ..

  • [Baekjoon] 2042 - 구간 합 구하기 (C++)

    [Baekjoon] 2042 - 구간 합 구하기 (C++)

    1. 문제 문제 어떤 N개의 수가 주어져 있다. 그런데 중간에 수의 변경이 빈번히 일어나고 그 중간에 어떤 부분의 합을 구하려 한다. 만약에 1,2,3,4,5 라는 수가 있고, 3번째 수를 6으로 바꾸고 2번째부터 5번째까지 합을 구하라고 한다면 17을 출력하면 되는 것이다. 그리고 그 상태에서 다섯 번째 수를 2로 바꾸고 3번째부터 5번째까지 합을 구하라고 한다면 12가 될 것이다. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)과 M(1 ≤ M ≤ 10,000), K(1 ≤ K ≤ 10,000) 가 주어진다. M은 수의 변경이 일어나는 횟수이고, K는 구간의 합을 구하는 횟수이다. 그리고 둘째 줄부터 N+1번째 줄까지 N개의 수가 주어진다. 그리고 N+2번째 줄부터 N+M+K+1번째 ..

  • [Baekjoon] 2479 - 경로 찾기 (C++)

    [Baekjoon] 2479 - 경로 찾기 (C++)

    1. 문제 길이가 같은 두 개의 이진수 코드 A와 B가 있다고 하자. 이 두 코드 사이의 해밍 거리는 A와 B의 각 비트를 왼쪽부터 오른쪽으로 차례대로 비교할 때 서로 다른 값을 가진 비트의 수이다. 예를 들어, A=010010, B=011011 이라고 하면, 세 번째 비트와 여섯 번째 비트만 서로 다르므로 이 두 코드 사이의 해밍 거리는 2이다. 우리는 총 N개의 이진 코드를 가지고 있고, 각 코드의 길이는 K로 같다. 예를 들어, 다음과 같이 길이가 3인 5개의 이진 코드들이 있다. A=000 B=111 C=010 D=110 E=001 두 코드 A와 B사이의 해밍 거리를 H(A,B)로 표현한다. 그러면, H(A,B)=3, H(A,C)=1, H(A,D)=2, H(A,E)=1 이다. 우리는 이진 코드들에..

  • [Baekjoon] 1167 - 트리의 지름(C++)

    [Baekjoon] 1167 - 트리의 지름(C++)

    1. 문제 트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오. https://www.acmicpc.net/problem/1167 1167번: 트리의 지름 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 www.acmicpc.net 2. 해결 아이디어 1) 각 노드마다 갈 수 있는 최대 cost를 2개까지 저장한 뒤(재귀 방식이라 시간 복잡도 O(n)), 모든 노드의 최대 cost값 2개의 합을 비교하면서 가장 큰 최대 cost의 합을 출력한다. (= 트리의 지름) 한 노드에..

현재 가장 많은 대화가 이루어지는 곳입니다.

  • 유전 알고리즘으로 사이클로이드 유도하기 [1]

    유전 알고리즘으로 사이클로이드 유도하기 [1]

    Making Cycloid by Genetic Algorithm 0. 개요 사이클로이드가 최소 강하 곡선인 이유를 탐구하다, 해당 내용을 보고 사이클로이드를 유도하는 방법을 알게 되었다. https://suhak.tistory.com/88 사이클로이드(cycloid) 사이클로이드란? 구르는 원 위에 있는 한 정점이 그리는 자취를 사이클로이드라고 부른다. 위키백과로 가기 그림에서 원점과 접해있던 반지름이 1인 원이 $x$축을 따라 $t$만큼 굴러갔을 때 원점 suhak.tistory.com 또한 여기서 사이클로이드를 그릴 수 있었는데, 해당 코드는 다음과 같다. from math import sin, cos, pi import numpy as np import matplotlib.pyplot as plt ..

  • [WEB] 스도쿠 풀이 프로그램 #4

    [WEB] 스도쿠 풀이 프로그램 #4

    이전 글에서 python으로 만들었던 스도쿠 풀이 프로그램을 누구나 바로 사용할 수 있도록 html, css, js로 다시 만들어보았다. 간단하게 알고리즘을 설명하자면 입력받은 스도쿠가 해결가능한지 확인한다. 재귀함수로 구현한 백트래킹 알고리즘을 사용해 입력받은 스도쿠의 해를 찾는다. 만약 해가 있다면, 밑에 출력한다. 해를 찾을 수 없다면, 'Unable To solve Sudoku'를 출력한다. 소스코드 참고 - https://github.com/siejwkaodj/sudoku_solver_online Sudoku Solver Made by Hansj 설명 빈 칸에 스도쿠에 적혀있는 1-9 사이의 숫자를 입력하세요. 0을 입력하면 다음 칸으로 넘어갑니다. 파일 업로드는 .csv 또는 .txt파일만 가..

  • [Baekjoon] 1107 - 리모컨 (C++)

    [Baekjoon] 1107 - 리모컨 (C++)

    1. 문제 문제 수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장 났다. 리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고 있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대만큼 있다. 수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장 났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오. 수빈이가 지금 보고 있는 채널은 100번이다. 입력 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 ..

  • [C++] list 자료형 사용하기 - Quick Note

    [C++] list 자료형 사용하기 - Quick Note

    ** 주의 PS를 할 때 C++에서 list 자료형은 인덱싱을 할 수 없다는 치명적인 결함 때문에 거의 쓰이지 않습니다. 이 글에서는 list 자료형을 사용할 수 있는 방법을 소개했지만, PS를 할 때는 다른 라이브러리를 사용하는 것을 추천드립니다. 1. 개요 알고리즘을 풀 때 만약 요소를 순서대로 조회하면서 인덱싱을 하려면 std::vector 라이브러리나 std::deque, std::map (포인터로 iterator 생성가능) 등의 자료형을 사용할 것이다. 하지만 만약 시퀀스 중간에서 삽입, 삭제가 일어나야 할 경우, 위에 나온 자료형 모두 사용하기가 애매해진다. (map은 확인 필요) - 특히, std::vector는 push_back, pop_back 등의 메소드는 amortized O(1)로 ..

  • 유전 알고리즘으로 사이클로이드 유도하기 [2]

    유전 알고리즘으로 사이클로이드 유도하기 [2]

    지난 포스팅에서는 유전 알고리즘을 통해 사이클로이드를 유도하는 법을 알아보았다. 하지만 교차 및 돌연변이 방식, 기울기를 정하는 방식, 정규화 방법 등 아직 개선점이 많이 필요한 모습을 보였다. 그중 무엇보다 적합도가 93% 이상 올라가지 않던 문제가 가장 해결하기 어려웠다. max_gen = 1000 num = 100 min_m = -10 mut_chance = 0.3 mut_rate = 0.4로 돌린 결과이다. 사진과 같이 최고 적합도는 크게 올라가지 않는 모습을 보여준다. 여기서 필자는 교차 및 돌연변이 방법에 문제가 있다고 생각해 해당 방법을 고민하던 중, 해당 프로그램을 보던 한 친구가 구간의 길이를 줄여보자는 아이디어를 건의했다. 현재 유전 알고리즘은 가로 5π, 세로 10인 공간 속에서 돌아..