Algorithms
6 posts
<C++/백준 16637> 괄호 추가하기

괄호 추가하기 📌 문제 패턴 인식 연산자가 등장할 때마다 2가지 선택(괄호 유무)이 가능하고, 이전까지의 계산 결과를 기반으로 다음 선택을 해야 하는 유형 🔍 특징 수식에서 ”누적되는 값 + 다음 선택” 형태 psum(prefix_sum, 누적합 문제!) 괄호 위치 결정 문제 매 시점 2가지 선택 가능 💡 핵심 아이디어 1. 누적값 + 방향 결정 지금까지의 계산 결과를 가지고 다음에 어떤 연산을 할지 결정! 형태로 구현 2. 매 시점 2가지 선택 괄호 없이 그냥 계산 다음 두 수를 묶어서 계산 (인덱스 주의) 🔨 코드 구현 기본 뼈대 주요 자료구조 🎯 문제 해결 접근법 1. 첫 번째 단계 “누적값 + 선택” 패턴 인식하기 형태 떠올리기 2. 두 번째 단계 매 위치에서 가능한 선택지 정리 재귀로 모든 경우 탐색 👀 비슷한 문제 패턴 수식 계산 + 괄호 추가/삭제 매 시점 2가지 이상 선택지 이전 결과로 다음 선택하는 경우 📝 예시 입출력 ⚠️ 주의사항…

<C++/백준 1992> 쿼드트리

코드 해당 문제의 솔루션은 주석과 함께 정리해보았다. 해당 문제를 보고, 내가 특히 부족하다고 느낀 점은. 크게 두 가지다. 이 문제를 이해하는 데 꽤 시간이 걸렸다는 것. ( 이 시간을 단축시켜야 한다. ) 문제를 이해하고 규칙도 파악했으나, 그것을 코드로 표현하지 못했다. ( 재귀 함수를 구현하는 데 아직 경험이 부족해서 이다. ) 해당 문제를 보면, ‘재귀 함수’로 풀어야지가 떠올라야 한다. 큰 문제를 동일한 형태의 작은 문제로 나눌 수 있다는 점이 재귀의 특징이다. 파라미터를 변화시키면서, (4등분으로 나누는 패턴을 반복시킬 수 있다.) 재귀 함수 구현력을 향상 시키고, 해당 문제와 비슷한 문제를 반복 연습하자! 그러면 비슷한 문제가 와도 어렵지 않게 해결할 수 있을 것이다.

<코드트리/C++> 그 요일은

문제 설명 2024년은 윤년입니다. m1월 d1일이 월요일일 때, m2월 d2일까지 특정 요일 A가 몇 번 등장하는지 구하는 문제입니다. 입력 조건 첫 번째 줄: m1, d1, m2, d2 (공백으로 구분) 두 번째 줄: A (요일 문자열) 1 ≤ m1 ≤ m2 ≤ 12 1 ≤ d1, d2 ≤ 31 A는 , , , , , , 중 하나 출력 조건 A 요일이 등장하는 횟수 풀이 접근 💡 Key Insight 소스 코드 주요 학습 포인트 날짜 계산의 기본 월별 일수를 배열로 관리 누적 일수 계산 방법 요일 처리 요일의 숫자 표현 (0-6) 모듈러 연산을 통한 요일 순환 자료구조 선택 작은 크기의 고정 데이터는 단순 if-else가 효율적 unordered_map 같은 복잡한 자료구조는 불필요 코드 구조화 기능별 함수 분리 명확한 변수명 사용 개선 가능 사항 ans를 전역 변수로 선언하는 대신 지역 변수로 사용 요일 변환 함수를 switch-case 문으로 변경하여 가독성 향상 날짜 유…

<코드트리/C++> 만나는 그 순간

약 10일 전 쯤 내가 풀었던 문제 같은데, 다시 보니까 못풀고 있어서, 여기에 다시 정리해보았다. [시뮬레이션] 만나는 그 순간 💡 문제 이해 두 사람 A, B가 동일한 시작점에서 출발하여 각자의 이동 명령(L 또는 R)에 따라 1초에 1m씩 움직일 때, 최초로 만나는 시간을 구하는 문제입니다. 🤔 문제 해결 방향 A와 B 각각의 매 초별 위치를 배열에 기록합니다. 시간을 1초부터 검사하면서, A와 B의 위치가 일치하는 최초의 시점을 찾습니다. 주의할 점 전체 이동 시간이 큰 배열을 필요로 할 수 있습니다. (MAX_T = 1000000) A와 B의 시작 위치는 0으로 초기화되어야 합니다. 만약 움직임이 끝날 때까지 만나지 않으면 -1을 출력해야 합니다. ✍️ 코드 내 코드 해설 코드 🔎 코드 비교 분석 두 코드는 동일한 아이디어로 구현되었으나, 몇 가지 구현 방식의 차이가 있습니다: 시간 관리 방식 내 코드: 변수로 누적 시간 관리 해설 코드: , 변수로 개별 시간 관리 반복…

<알고리즘 노트> dx, dy 테크닉 기법

dx, dy 테크닉 기법 은 격자 문제나 방향 시뮬레이션 문제를 풀 때 유용하게 사용되는 기법. 방향 전환, 인덱스 고려 등을 추가로 신경 써야 하는 경우도 있다. 기본 개념 방향이 , 배열의 인덱스가 됨. 문제를 보면 먼저 격자나 그래프를 간단히 그림으로 그려보고, 각 방향에 맞는 x, y 증감값을 설정. 예시 문제 풀이 순서 , 배열을 먼저 작성. 문제의 요구사항에 맞게 방향과 이동을 구현. 방향 전환 방향 전환은 변수로 관리. 반시계 방향 90도 회전 시계 방향 90도 회전 격자 문제에서의 주의점 , 테크닉 활용하기. 인덱스가 0부터 시작인지, 1부터 시작인지 확인. 격자에서의 는 2차원 배열의 와 동일. 각각을 행(row, r), **열(column, c)**로 생각. 그림을 그려 , 를 구성. 예시: 동서남북 인덱스 범위 오류 주의! 가 격자 안에 있는지 확인하는 bool 함수 설계. 조건문에서 함수 순서를 신경 쓰기: 범위 확인 함수 예시

<알고리즘 노트> Carry 피하기 2

알고리즘 노트: Carry 피하기 2 문제 설명 문제 유형: 완전탐색 n개의 숫자 중 서로 다른 3개의 숫자를 선택하여, carry가 발생하지 않으면서 나올 수 있는 숫자 합의 최댓값을 계산하는 프로그램을 작성합니다. Carry란? 각 자리수를 더했을 때 10을 넘어가는 경우 carry가 발생합니다. 예를 들어: 3 + 6 = 9 (carry 발생하지 않음) 5 + 7 = 12 (carry 발생) 입력 형식 첫 번째 줄에 n이 주어집니다. 두 번째 줄부터 n개의 줄에 숫자가 주어집니다. 3 ≤ n ≤ 20 1 ≤ 숫자의 범위 ≤ 10,000 출력 형식 carry가 발생하지 않으면서 3개의 숫자의 합의 최댓값을 출력합니다. 모든 숫자쌍에서 carry가 발생할 경우 을 출력합니다. 예제 입력 출력 설명 522, 6, 7311을 선택하면, 각 자리수의 합에서 carry가 발생하지 않으므로 합은 7839입니다. 내 풀이 코드 풀이 설명 숫자를 으로 변환하여 각 자리수를 비교. 세 숫자의 …