[Algorithm] 비트마스킹 이론 & BOJ 11723 실습
·
🖥️ Computer Science/Algorithm
https://www.acmicpc.net/problem/11723위 11723을 푸는데, Set으로 풀어서 실패하고아래처럼 20개만 갖는 정수 배열로 0 1 판단을 했더니 실패했다.// 실패한 코드let M = Int(readLine()!)!var array = Array(repeating: 0, count: 20)(0..비트마스킹연산자 설명a & b: ANDa | b: ORa ^ b: XOR~a: NOTa : a를 b비트 만큼 왼쪽으로 옮김 (값 증가)a >> b: a를 오른쪽으로 옮김 (값 감소)할당 연산자|=: 비트 OR 할당 특정 비트를 켜는 것 var bit = 0 // 0000 bit |= (1 &=: 비트 AND 할당 특정 비트를 끄는 것 var bit = 6 // 0110 bi..
[Algorithm] 백준 32350 - Swift 풀이
·
🖥️ Computer Science/Algorithm
개요32350번 문제는 특별한 알고리즘을 요구하는 문제가 아닌, 구현 문제이다. 문제링크그러나 수많은 억까를 당하며 배운 내용을 정리해보겠다. 문제 풀이문제 이름 답게 '오버킬'이 발생하면 정상범위 인덱스 내에서 다음 인덱스의 값을 차감해야 한다.차감할 때는 '오버된 값의 p%'만큼 감소하는데여기서 나는 Int(floor(Double(abs(currentValue)) * (Double(p) * 0.01)))로 작성했다.그런데 이처럼 하면 87%에서 틀렸다고 뜬다.왤까 ?let NDp = readLine()!.split(separator: " ").map { Int($0)! }let N = NDp[0], D = NDp[1], p = NDp[2]var M = readLine()!.split(separator..
Swift로 알고리즘 풀 때 알아둬야할 것들
·
🖥️ Computer Science/Algorithm
1. Character 타입은 Int로 변환이 불가능하다.let str = "12345"let intValue: Int = Int(str[str.index(str.startIndex, offsetBy: 0)]))! // 에러let intValue: Int = Int(String(str[str.index(str.startIndex, offsetBy: 0)]))! // 정답 2. pow 함수는 첫 번째 인자가 Decimal 타입인데, 그냥 Double 쓰면 됨let a = 10let b = 5let result = Int(pow(Double(a), Double(b)))
Swift로 코드 최적화하기
·
🖥️ Computer Science/Algorithm
백준/프로그래머스 풀다보면서 얻은 Swift 꿀팁 정리(다른 언어도 포함일 수도 ㅇㅇ) 1. 입력 받을 때 map { Int($0)! } 보다는 map { Int(String($0))! }이 더 빠르다.let input = readLine()!.split(separator: " ").map { Int($0)! }vslet input = readLine()!.split(separator: " ").map { Int(String(($0))! }2. 함수 단위로 코드를 실행하면 컴파일러 최적화 측면에서 더 효율적이다.func solve() -> Int { var N = Int(readLine()!)! var crane = readLine()!.split(separator: " ").map { Int..
[백준] 7576, 토마토 (Swift)
·
🖥️ Computer Science/Algorithm
- 일반적인 bfs 사용 시 시간초과 발생 - Queue에 pop 하여 원소를 빼내지 말고, 인덱스적 접근을 할 것 (시간초과 확보 가능) - 입력으로부터 graph 만드는 능력이 아직 부족함 // 24년 겨울 알고리즘 스터디 // BOJ & 프로그래머스 // // Created by 박효준 on 1/10/24. // bfs 탐색 import Foundation let MN = readLine()!.split(separator: " ").map{Int(String($0))!} let M = MN[0], N = MN[1] var graph: [[Int]] = [] let mx = [0,0,-1,1], my = [-1,1,0,0] for _ in 0..= 0 && ny < M { if graph[nx][ny..
[백준] 2644, 촌수계산(C++, BFS)
·
🖥️ Computer Science/Algorithm
BFS 기초 문제 풀어보기 https://www.acmicpc.net/problem/2644 2644번: 촌수계산 사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어 www.acmicpc.net 2644번 : 촌수계산 * 입출력 예시 // 입력 9 7 3 7 1 2 1 3 2 7 2 8 2 9 4 5 4 6 // 출력 3 8과 6일땐 ? => 8에서 6을 못 감 => -1 출력 #include #include #include #include #include #include #include using namespace std; #define M..
[백준] 13414, 수강신청 (C++, 해시맵)
·
🖥️ Computer Science/Algorithm
https://www.acmicpc.net/problem/13414 13414번: 수강신청 입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 과목의 수강 가능 인원 K(1 ≤ K ≤ 100,000)와 학생들이 버튼을 클릭한 순서를 기록한 대기목 www.acmicpc.net 이번 주 스터디는 내 차례가 되어 조금 더 깊게 이 문제에 대해 공부해봤고, 이 문제를 풀어봄으로써 C++의 STL에 대해 조금 더 알게되었다. #include #include #include #include #include using namespace std; // sort, unordered_map(해시맵), pair, auto, iterator bool compare(const ..
[C언어] 표준 입력 함수, scanf() 함수의 오류 찾기
·
🖥️ Computer Science/Algorithm
오류찾기 다음은 잘못된 코드이다. 왜 그런지 알아보자. 오류를 먼저 찾을 수 있는지 확인해 보고 아래 글을 읽기를 추천한다. #include int main() { char arr[21] = "”; /* 모두 널로 초기화 */ printf("최대 20문자 입력 가능\\n"); printf("(Q 혹은 이 입력 시 종료)\\n"); printf("---------------------\\n"); for(int i=0; i
[백준] 2579번, 계단 오르기 (Java/자바) 동적 계획법 실습
·
🖥️ Computer Science/Algorithm
동적 계획법을 지난 시간에 배웠으니, 그에 맞는 문제를 풀어보려 한다. 백준의 실버3 난이도 DP 알고리즘을 쓰는 '2579번 : 계단 오르기' 문제이다. 문제 규칙 이 문제에서는 규칙을 문제 설명에 명시해 두었다. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음다음 계단으로 오를 수 있다. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다. 마지막 도착 계단은 반드시 밟아야 한다. 동작 원리의 핵심은 2번에 있다. 세 개의 계단을 연속되게 밟으면 안 되고, 한 번에 세 칸 이상씩은 이동할 수 없다는 점이다. 백준에 나와있는 입력 예제이다. 첫 번째 int 변수 n에 계단 개수를 받아주고 계단의 값을 담아..
[알고리즘] DP(Dynamic Programming) 동적 계획법
·
🖥️ Computer Science/Algorithm
이번 주 백준 문제 유형이 자료구조 수업 때 배우지 않은 DP이기에 이를 공부한 바탕으로 DP를 정리해보려 한다. 두괄식으로 먼저 DP를 정의한 문구들을 보고 가자. DP란 ? → *메모이제이션(Memoization) 기법을 이용하며 '하나의 문제는 단 한 번만' 풀도록 하게 하는 알고리즘 * 계산했던 것을 메모리 공간에 기억해 두고, 같은 식을 써야한다면 앞에서 기억한 것을 재사용하는 기법 분할 정복 기법과 DP의 차이점 분할 정복 : 큰 문제를 작은 부분 문제로 나누고, 그 하위 문제를 독립적으로 해결하고 이를 합쳐서 원래 문제를 해결함 동적 계획법(DP) 분할 정복 중복되는 문제 O X 메모이제이션 O (중복 문제의 결과를 저장하고 재활용함) X 문제 분할 방식 문제의 크기와 형태에 따라 다름 동일..