Processing math: 100%

분류 전체보기 34

[BOJ 20310] 타노스

문자열 S에서 0과 1을 각각 절반씩 제거하여 새로운 문자열 S을 만들었을 때, 그중 사전순으로 가장 빠른 것을 구해야 한다. 사전순으로 앞에 나오기 위해서는 0이 1보다 앞에 나오는 것이 이득이다. 즉, 앞에서부터 읽어보며 0이면 출력하고 1이면 제거하는 것을 각 숫자 개수의 절반씩 진행하면 된다. 0은 그 이후로는 제거하고, 1은 출력하면 사전순으로 가장 빠른 것을 구할 수 있다. string s, ans; int cnt[2]; int main(void) { fastio; cin >> s; for (char c : s) cnt[c - '0']++; cnt[0] /= 2, cnt[1] /= 2; for (char c : s) { if (c == '0' && cnt[0]) cnt[0]--, an..

알고리즘 2024.03.26

[BOJ 4900] 7 더하기

구현 문제이다. 보기 편하도록 맵과 배열을 이용해 변환 과정을 처리해놓았다. string digitTo7Segment[10] = { "063", "010", "093", "079", "106", "103", "119", "011", "127", "107" }; map _7SegmentToDigit = { {"063", "0"}, {"010", "1"}, {"093", "2"}, {"079", "3"}, {"106", "4"}, {"103", "5"}, {"119", "6"}, {"011", "7"}, {"127", "8"}, {"107", "9"} }; string getNumBy7Segment(string s) { string ret = ""; for (int i = 0; i < s.length(); ..

알고리즘 2024.03.26

[BOJ 17215] 볼링 점수 계산

볼링을 몇 번 쳐서 규칙을 아는 사람이라면 규칙대로 구현만 하면 되는 문제이다. 규칙을 모른다면 살짝 헷갈릴 수 있다. 구현할 때, 헷갈리지 않게 먼저 점수판을 만들어 준 후에 계산을 진행하였다. string s; int frame[11][3]; int main(void) { fastio; cin >> s; int f = 1, cnt = 0, score = 0; for (int i = 0; i < s.length(); i++) { if (s[i] == '-') frame[f][cnt++] = 0; else if (s[i] == 'S') { frame[f][cnt++] = 10; f++, cnt = 0; } else if (s[i] == 'P') { frame[f][cnt++] = 10 - frame[f]..

알고리즘 2024.03.26

[BOJ 2806] DNA 발견

아래와 같이 정의하자. Ci: i번째 문자 (A|B) f(i,A): Ci까지 봤을 때, 모두 A로 만드는 최소 비용 f(i,B): Ci까지 봤을 때, 모두 B로 만드는 최소 비용 Ci=A라면, f(i,A)=min(f(i1,A),f(i1,B)+1) AAAA+A라면 그대로 유지 BBBB+A라면 BBBB를 모두 A로 변경 f(i,B)=min(f(i1,A),f(i1,B))+1 AAAA+A라면 전체를 B로 변경 BBBB+A라면 AB로 변경 Ci=B라면, $f(i, A)=\min (f(i-1, A), f(i-1, B))..

알고리즘 2024.03.25

[BOJ 27966] △

모든 정점 쌍에 대해 두 정점 사이의 거리의 합을 최소화하는 문제이다. 머릿속으로 모양 몇 개를 떠올리면 금방 풀 수 있는 문제이다. 하나의 정점 아래에 다른 모든 정점을 연결하면 된다. 이렇게 한다면 최솟값은 루트 정점에서 다른 정점들 사이의 거리의 합인 1×N1과 다른 모든 정점 쌍들 사이의 거리의 합인 2× NC2를 더한 값이 된다. int 범위를 벗어남을 유의하자. long long N; int main(void) { fastio; cin >> N; cout

알고리즘 2024.03.25

[BOJ 26008] 해시 해킹

h(P)=(P0×A0+P1×A1++PN1×AN1) mod M 에서 P0×A0+P1×A1++PN1×AN1의 형태는 마치 A진법의 형태와 같다. 이러한 형태에서 Pi<Ai라면 P0×A0+P1×A1++PN1×AN1는 고유한(중복되지 않는) 값을 가질 것이다. 하지만 이는 문제와 크게 관련이 없으니 넘어가도록 하자. 위의 식을 조금 정리해 보자. h(P)=(P0×A0+P1×A1++PN1×AN1) mod M에서 $P_0\time..

알고리즘 2024.03.24

04-Flutter 첫 번째 Flutter 앱 (2)

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ko#4 첫 번째 Flutter 앱 | Google Codelabs 이 Codelab에서는 멋진 이름을 무작위로 생성하는 Flutter 앱을 빌드하는 방법을 알아봅니다. codelabs.developers.google.com 여기서부터 이어서 진행하려고 한다. 우선 초기 상태에서 주어졌던 center alignment와 floatingActionButton을 제거하고 시작을 하려고 한다. 또한, 우상단의 DEBUG 표시가 거슬렸기에 MaterialApp에 debugShowCheckedModeBanner를 false로 설정해주면 class MyApp extends Statele..

개발 2024.03.22

[BOJ 11899] 괄호 끼워넣기

올바른 괄호열의 가장 큰 특징으로 "닫는 괄호는 반드시 여는 괄호보다 나중에 나와서 쌍을 이뤄야 한다."가 있다. 이는 닫는 괄호가 먼저 나온다면 앞에 여는 괄호를 무조건 붙여야 한다는 의미이다. 나머지는 괄호가 쌍을 이룰 때마다 처리해주면 된다. 마지막에 스택에 남아있는 여는 괄호들의 뒤에 닫는 괄호를 모두 붙여야 한다는 것을 유의하자. string str; stack s; int ans; int main(void) { fastio; cin >> str; for (int i = 0; i < str.size(); i++) { if (str[i] == '(') s.push(str[i]); else { if (s.empty()) ans++; else s.pop(); } } ans += s.size(); cout

알고리즘 2024.03.22

03-Flutter 첫 번째 Flutter 앱

https://codelabs.developers.google.com/codelabs/flutter-codelab-first?hl=ko#0 첫 번째 Flutter 앱 | Google Codelabs 이 Codelab에서는 멋진 이름을 무작위로 생성하는 Flutter 앱을 빌드하는 방법을 알아봅니다. codelabs.developers.google.com colab으로 제공되는 스타터팩을 진행해보려고 한다. 맨 처음에 학습할 내용을 훑어주는데, 아래의 내용을 진행한다고 한다. Flutter 작동 방식의 기본사항 Flutter에서 레이아웃 만들기 버튼 누르기 등 사용자 상호작용을 앱 동작에 연결 Flutter 코드 체계적으로 유지 앱을 반응형으로 만들기(다양한 화면에 맞게) 앱의 일관된 디자인과 분위기 달성..

개발 2024.03.19

[BOJ 2036] 수열의 점수

어떻게 하면 수열의 점수를 최대화 할 수 있는지 생각해보자. 1. 음수는 더하는 것보다 음수와 곱해서 양수로 만들거나 0과 곱해 제거하는 것이 이득이다. (음수에서 양수 혹은 0이 되어 점수가 커진다) 2. 양수는 곱하면 이득이다. 단, 1은 곱하는 것보다 더하는 것이 이득이다. 3. 두 수를 곱할 때는 절댓값이 큰 수부터 곱하는 것이 이득이다. (2, 3, 4에서는 3, 4를 먼저 곱하는 것이 이득) 이렇게 크게 3가지 경우가 있다. 이를 조건 분기를 잘 진행해주면 해결 가능하다. (곱해지는 수가 크다. 자료형을 유의하자.) int main(void) { fastio; cin >> n; for (int i = 0; i > A[i]; sort(A, A + n); ll score..

알고리즘 2024.03.19