알고리즘 :: 백준 :: 1436 - 영화감독 숌
·
Problem Solving
❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악입력: N ≤ 10,000출력: N번째 종말의 수✏️ 문제풀이함정문제입니다.0666, 1666, 2666, 3666, 4666, 5666,6660, 6661, …., 6669, 7666, 8666, 9666총 19개… 그게 10666부터 11666까지…이렇게 빠져들기 시작하면 이 문제의 함정에 빠진 것입니다 ㅎㅎ함정에 걸리는 가장 큰 이유는 N이 10,000까지 가능해 오버플로우가 될 수도 있다고 생각하기 때문입니다. 단순하게 666부터 카운팅하면서 1,000으로 나머지연산(`%`)한 것이 666인 수를 찾으면 됩니다.while (temp) { if (temp % 1000 == 666) { answer++; break; } temp..
알고리즘 :: 백준 :: 2852 - NBA 농구
·
Problem Solving
https://www.acmicpc.net/source/88151964  ❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악득점 개수 1 ≤ N ≤ 100각 득점 정보는 문자열로 "mm:ss" 형식출력: 1번팀이 이기고 있던 시간, 2번팀이 이기고 있던 시간✏️ 문제풀이1. 시간(초)을 하나의 칸으로 생각하는 방법'분'과 '초' 서로 다른 단위가 있을 때는 어느 한 쪽 단위로, 되도록이면 작은 단위로 통일하는 것이 좋습니다.농구경기 48분을 초로 환산하면 2,880초이므로 전체 농구경기를 연속된 2,880칸으로 표현할 수 있습니다. 문자열 "mm:ss"가 주어졌을 때, `int` 타입의 초로 환산하는 방법은 다음과 같습니다.60 * stoi(line.substr(0, 2)) + stoi(line.subst..
알고리즘 :: 백준 :: 3474 - 교수가 된 현우
·
Problem Solving
❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악입력: 테스트 케이스 T입력: 각 테스트 케이스마다 정수 1 ≤ N ≤ 1,000,000,000출력: $N!$를 나타냈을 때 오른쪽 끝에 있는 0의 개수✏️ 문제풀이당연히 `int`든 `unsigned long long`이든 수의 범위를 가볍게 넘어가기 때문에 직접 계산하는 문제가 아닙니다 ㅎㅎㅎ 0을 만들기 위해서 필요한 '재료'는 2와 5가 있습니다.$N!$를 나열하는 과정에서 2, 4, 6, 8 ... 정말 많은 2가 생성됩니다. 즉, 2라는 재료는 넘쳐난다는 뜻입니다.따라서, 0을 만들기 위한 '핵심재료'는 5입니다. $N!$ 속에 5가 몇 개 있느냐에 따라 0의 개수가 결정됩니다.코드로 나타내면 정말 간단합니다.for (int i = 5; i N ..
알고리즘 :: 백준 :: 10709 - 기상캐스터
·
Problem Solving
❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악1 ≤ 높이 H, 너비 W ≤ 100각 칸마다 `.` 또는 `c` 문자가 들어옴.✏️ 문제풀이간단한 시뮬레이션 구현 문제입니다.구름 위치(좌표)를 입력받은 뒤, 각 구름마다 실제로 이동시키면서 시간을 계산하는 방법.구름은 동쪽으로만 이동하고 외부 유입없다는 점에서 착안, 구름이 있는 칸은 '0', 그 오른쪽부터 한 칸마다 1, 2, 3, 4... 1씩 늘려가며 초기화하기.아무래도 두 번째 방법이 더 쉽고 간단하기 때문에 두 번째 방법을 사용하면 좋을 것 같습니다.읽은 문자가 `c`이면, 카운팅 변수를 0으로 초기화하고 현재 칸을 0으로 초기화.읽은 문자가 `.`이면, 카운팅 변수 1 증가하고, 현재 칸을 카운팅 변수로 초기화.카운팅 변수는 각 행마다 다시 ..
알고리즘 :: 백준 :: 2870 - 수학숙제
·
Problem Solving
❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악1 ≤ N ≤ 100소문자와 숫자로만 이루어진 문자열 길이 ≤ 100✏️ 문제풀이생각해야 할 반례가 많아서 조금 복잡한 문제입니다.반드시 조건을 먼저 정리하고, 어느정도 손코딩을 마친 뒤에 코딩에 들어가야 햇갈리지 않습니다. 문자열을 처음부터 끝까지 읽다가 숫자를 만난다면,'0'으로 시작하는 숫자인 경우'0'이 아닌 문자 (숫자 또는 소문자)가 나올 때까지 스킵합니다. (단순히 인덱스 변수 증가)이때 세 가지 경우가 발생합니다.다른 숫자를 만난 경우: 아래 '0'으로 시작하는 숫자가 아닌 경우로 이동 후 처리됩니다.소문자를 만난 경우: "00000... " 같은 경우였네요, 토큰을 "0"으로 초기화 해줍니다.문자열 범위를 벗어난 경우 (즉, 문자열 가장 뒤..
알고리즘 :: 백준 :: 4659 - 비밀번호 발음하기
·
Problem Solving
https://www.acmicpc.net/source/88126015      ❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악"end"가 나올 때까지 계속 입력받기각 패스워드 문자열 20글자 이하, 대문자로만 이뤄진 문자열✏️ 문제풀이문제에 주어진 세 가지 조건을 빠짐없이 구현하기만 하면 되는 문제입니다. 다른 방법은 없습니다. 첫 번째 조건: 모음(a,e,i,o,u) 하나를 반드시 포함하는지 검사하기inline bool isVowel(char c) { return (c=='a') || (c=='e') || (c=='i') || (c=='o') || (c=='u');} 두 번째 조건:모음 또는 자음이 3개 연속으로 오면 안 된다.각 글자마자 모음인지 자음인지 판단합니다. 모음이면 모음 카운터 변수 증..
알고리즘 :: 백준 :: 2910 - 빈도 정렬
·
Problem Solving
❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악요소 개수: 1 ≤ N ≤ 1,000각 요소의 최댓값(상한): 1 ≤ C ≤ 1,000,000,000✏️ 문제풀이빈도 정렬의 기준은 '많이 등장한 순'으로, 등장횟수가 같다면 '앞서 등장한 순'입니다.즉, 각 숫자와 대응하는 인덱스의 값마다 아래와 같은 정보를 갖고 있어야 합니다.이 숫자가 몇 번 등장했는지이 숫자가 언제 처음 등장했는지로직은 다음과 같습니다.숫자를 입력받습니다. 등장횟수, 첫 등장 인덱스 번호 정보를 함께 저장합니다.처음 등장했다면, 등장횟수는 1 입니다.처음 등장한 숫자가 아니라면, 삽입하지 말고 등장횟수만 1 증가시킵니다.문제에 나온 빈도 정렬의 기준에 따라 정렬합니다.원하는대로 정렬시켜주는 STL 함수는 없기 때문에 따로 정렬 함수객..
알고리즘 :: 백준 :: 2828 - 사과 담기 게임
·
Problem Solving
❔문제 🔗문제링크🔄 문제 및 입출력 조건 파악입력칸 수 N, 바구니의 크기 M, (1 ≤ M 사과의 개수 J (1 ≤ J ≤ 20)출력: 바구니 이동거리 최솟값✏️ 문제풀이최소로 이동하기 위해서는 최대한 바구니 양끝에서 사과를 받는게 이득이라는 건 쉽게 떠올릴 수 있습니다.만일 반대쪽에서 사과가 떨어진다면, 조금 덜 이동할 수 있을거고,사과가 바구니 안쪽으로 떨어질 가능성도 높아질 테니까요. 로직 자체는 상당히 간단합니다.사과가 떨어지는 위치가 왼쪽 끝에서 가까운지 아니면 오른쪽 끝에서 가까운지 판단합니다.더 가까운 방향으로 이동합니다. 단, 딱 사과가 위치한 지점까지만 움직이면 되겠습니다. 그렇다면, 왼쪽을 `l`이라 하면 오른쪽 끝 `r`을 어떻게 표현할 수 있을까요?바구니 크기 `M == 1`이..
알고리즘 :: 백준 :: 1992 - 쿼드트리
·
Problem Solving
❔문제 🔗문제링크 🔄 문제 및 입출력 조건 파악가로/세로 길이를 나타내는 N, 1 ≤ N ≤ 64N개의 문자열, 0과 1로 이뤄져있음.✏️ 문제풀이재귀 가능성 판단하기 전체 흑백영상을 압축하는 과정은 4개의 부분영상 중 하나를 압축하는 과정과 같습니다. 위 그림을 보면 길이만 절반으로 줄어들 뿐이고,범위 내에 있는 데이터가 모두 같다면 그냥 출력하고하나라도 다르다면, 2, 1, 3, 4사분면 순서대로 꼭짓점 위치에서 범위를 절반으로 줄이고 다시 검사하면 됩니다.N은 최대 64, 최대 데이터 수는 $2^{16}$으로 많지 않습니다. 이렇게 전체 문제와 부분 문제가 같다는 점 + 처리할 데이터가 많지 않다는 점을 파악해서 재귀로 풀 수 있어야 합니다. 풀이과정시작점 `(y, x)`에서 가로, 세로로 `l..
알고리즘 :: 백준 :: 2178 - 미로탐색
·
Problem Solving
❔문제 🔗문제링크 🔄 문제 및 입출력 조건 파악입력:N × M 미로, '붙어서' 들어오는 입력`scanf("%c")` 이용또는 `std::string`으로 한 줄 입력받은 후 `for()`로 처리또는 `std::string`으로 한 줄 입력받은 후 그대로 사용하기2 ≤ N, M ≤ 100출력: (N, M)에 도달하기 까지 밟아야 하는 최소 칸 수시작하는 칸, 도착하는 칸도 밟은 칸 수에 포함됩니다.✏️ 문제풀이최소 칸 수 = 최적해가중치 없음 (모든 칸이 한 칸 이동에 동일하게 한 칸 소요) = BFS 이용방문표시 후 시작점 queue에 `push`4방향 중 갈 수 있는 칸은 queue에 `push`하고 방문표시 합니다.queue가 빌 때까지 반복합니다.4방향 검사하기미로의 경계범위를 넘어서지 않았고..