코딩테스트 썸네일형 리스트형 [백준] 1449번 : 수리공 항승 - C/C++ 문제에서 말하고 있는 내용은 단순하다.'물이 새는 위치 N개를 길이가 L인 테이프 몇 개를 이용해서 구멍을 막을 수 있는가'이다.하지만 고려해야할 부분이 존재한다.테이프의 길이가 L이고, 어떤 지점 x에 붙이면 x - 0.5부터 x + L - 0.5까지를 막을 수 있다라는 것이다.예를 들어서, 물이 새는 위치가 1일 때, 테이프는 0.5 ~ 2.5까지를 막는다.그 다음 구멍이 3에 있다면, 기존 테이프로는 못 막기 때문에 새로운 테이프가 필요하다.그렇기 때문에 기준점과 테이프로 가려지는 범위를 정확하게 구하는 것이 중요하다. 그 점을 고려하여 문제를 풀어보자. 물이 새는 위치와 테이프의 길이, 그리고 필요한 테이프의 개수를 선언해주자.그리고 물이 새는 위치는 벡터에 저장하여 정렬과 순차접근이 가능하도.. 더보기 [백준] 1072번 : 게임 - C/C++ 문제에서 요구하는 것은 간단하다.몇 번의 게임을 반복해서 승률을 높일 수 있는지를 구하는 것이다. 여기서 주의해야할 점은 게임의 횟수 변수의 타입이다.int형으로 설정하는 것이 아닌 long long 으로 설정해야한다. 문제 설명에서 x는 10억까지 올 수 있다고 하니,64비트 정수를 표현할 수 있는 long long 을 사용하자. 승률(z) 공식은 어떻게 될까?int z = (y / x) * 100; 이렇게 쓰면 틀린다.왜요?정수 나눗셈 → 곱셈 순서이기 때문에 소수점은 날아가면서 실제 승률보다 낮게 나올 가능성이 있다.y = 80, x = 100 이라면y/x = 0 이 되어버리면서 0*100 이라는 말도 안 되는 계산을 해야할 수도 있기 때문이다. 아래와 같이 승률 공식을 바꾸자.int z = (y .. 더보기 [백준] 9659번 : 돌 게임 5 - C/C++ 쉽다 쉬워.#include //돌 게임 5using namespace std;int main(){ int n; cin >> n; if(n 제출해볼까~틀렸다.나는 간단하게 생각한다고 생각했는데, 너무 간단하게 생각했던 것 같다.코드를 이렇게 써놓고 맞을 것이라는 기대를 한 내 자신이 너무 웃기다. 다시 접근해보자.그럼 나는 힌트를 볼 수 밖에 없다.힌트? 백준에 힌트도 있나요? 할 수 있는데내가 말하는 힌트는 '알고리즘 분류'이다.알고리즘 분류가 '게임 이론' 이라는데 처음 본다. 진짜로. 게임 이론게임 이론은 말 그대로 두 명 이상의 플레이어가 규칙에 따라 경쟁하거나 협력하는 상황을 수학적으로 분석하는 이론이다. 프로그래밍에서 말하는 게임 이론 문제는 보통 두 명이 번갈아 가며 어떤 행.. 더보기 [백준] 3036번 : 링 - C/C++ 문제부터 이해해보자.문제에서 요구하는 것은 간단..? 하다. 여러 개의 링이 주어졌을 때, 첫 번째 링을 기준으로 나머지 링들이 몇 바퀴 도는지를 기약분수 형태로 나타내는 문제이다.쉽게 말해서 첫 번째 링이 한 바퀴 돌 때, 다른 링들이 몇 바퀴 도는지를 구하는 것이다. 문제는 아래의 아이디어를 가지고 출발한다.기준은 첫번째 링의 반지름으로 한다.나머지 링들의 반지름을 입력받는다.첫번째 링과의 회전 비율을 고려하여 기약분수 형태로 나타낸다.최대공약수 개념을 사용한다. (기약분수 형태로 만들기 위함)필요한 반지름 개수 n과 n개의 반지름을 입력하면 다음과 같이 코드를 작성할 수 있다.int n;vector v;int main(){ cin >> n; for(int i = 0; i > x; .. 더보기 [백준] 1107번 : 리모컨 - C/C++ 문제를 읽고 바로 풀이 과정이 떠오르지는 않았다.그 이유는 문제 자체를 이해 못했기 때문.문제에서 요구하는 내용을 정리하면 다음과 같다. 리모컨을 이용해서 채널 n으로 이동할 때, 버튼을 최소로 누르는 문제이다.리모컨은 0~9까지의 숫자 버튼과 +/- 버튼이 있다.일부 숫자 버튼이 고장났을 수 있기 때문에 이 부분까지 고려해야 한다.(고장난 버튼의 수와 번호는 사용자가 입력함) 문제 풀이 순서는 다음과 같다.1. 채널 입력 받기2. 동작하지 않는 버튼 입력하기3. 결과 출력 당연한 과정을 설명했다. 이제 문제를 풀어보자. 크게 두 단계로 문제 풀이를 할 수 있다. +/- 버튼만 사용하는 경우현재 채널은 100이므로, |100 - N| 만큼 +/- 버튼을 눌러 이동할 수 있다.이를 초기 최소 횟수로 설정한.. 더보기 [백준] 1436번 : 영화감독 숌 - C/C++ 문제 풀이 순서는 간단하다.1. 몇 번째 영화 시리즈인지 n 값 입력 받기2. 초기값 설정3. 종말의 수 구하기 1번과 2번 과정을 한 번에 수행하면 아래와 같다.int n;cin >> n;int num = 666;int cnt = 1; cnt 값의 초기값을 1로 설정한 이유는 다음과 같다.첫 번째 '종말의 숫자'는 666이기 때문에 하나를 이미 찾았다고 가정한다. n번째 종말의 수를 찾을 때까지 while 문을 돌려주자.while (cnt != n) { num++; ... }} n의 값을 증가시켜주는 이유는 숫자를 하나씩 키우면서 666이 포함된 수를 찾아야하기 때문이다.666이라는 수가 포함되어있는지의 여부를 판단하기 위해서는int → string 의 형변환 작업이 필요하다.stri.. 더보기 [백준] 5347번 : LCM - C/C++ 두 수의 최소공배수를 출력하는 간단한 문제이다.1. 테스트 케이스 n 입력 받기2. a, b 입력 받기3. 최소공배수 구하기 vector를 이용하여 a, b를 입력 받을 것이다.그럼 헤더를 추가해주어야 한다.#include 그리고 테스트 케이스와 vector를 통한 a, b 입력 받기int n;cin >> n;vector> vec;int a,b; for(int i = 0; i > a >> b; vec.push_back(make_pair(a,b));} 완벽하게(?) vector에 값이 들어간다. 그리고 이 문제를 해결하는데에 핵심 역할이 되는 함수를 선언해준다.int lcm(ll a, ll b){ return (a * b) / gcd(a, b);} 위와 같이 최소공배수를 구할 수 있다.gcd라.. 더보기 [백준] 10773번 : 제로 - C/C++ 문제 풀이 순서는 아래와 같다.1. 입력할 숫자의 개수 k 입력2. k개만큼의 수 입력 받기 (0을 입력했다면 최근에 입력한 수 지우기)3. 입력을 완료했다면 남아있는 수 출력하기 최근에 입력한 수를 지우는 방법은 stack을 사용하면 된다.스택은 LIFO의 형태이기 때문에 0을 push 했을 경우에,두 번 pop 해주면 된다. 그렇게 코드를 작성해보자.스택을 사용하기 위해서는 헤더를 추가해주어야 한다.#include 입력받을 개수 k를 입력 받았다고 가정하고,스택을 구현하자.stack st;for(int i=0;i> n; if(n == 0){ if(!st.empty()){ st.pop(); } } else { t.push(n); }} 스택을 이렇게 간단하게 구현할 수 있다!0을.. 더보기 이전 1 2 3 4 다음