본문 바로가기

프로그래밍

(100)
[C++] 백준 2840번: 행운의 바퀴 문제 바로가기 이 문제에서 주의할 사항들 바퀴에 같은 글자는 두 번 이상 등장하지 않는다. 새로 지정할 칸에 ?가 아닌 다른 글자가 있으면 안 된다. ?는 두 번 이상 등장해도 괜찮다. 나는 1번을 늦게 파악했다. 문제를 제대로 읽어봤어야 했다. 3번은 어쩌면 당연한 것이지만, 1번을 처리하는 과정에서 A???와 같은 결과가 !로 바뀐다. 이를 주의해야 했다. 나는 이 문제를 vector를 이용해 풀었다. 코드 자체는 간단하다. #include #include using namespace std; int main() { int N, K; scanf("%d %d", &N, &K); vector wheel(N, '?'); auto iter = wheel.begin(); for (int i = 0; i < K..
[C++] 백준 1260번: DFS와 BFS 문제 바로가기 이 문제를 풀기 전에는 DFS, BFS에 대해서 아는 것이 거의 없었다. 유튜브 강의 여럿을 참고했는데, 다음 영상이 도움이 많이 됐다. 나는 위 영상에서 처럼 클래스를 생성해서 이 문제를 풀기로 다짐했다. Node 클래스와, Graph 클래스를 정의했다. 모든 멤버들은 public으로 선언하여 외부에서 자유롭게 접근할 수 있도록 했다. Node에는 출력했음을 기록하는 mark, Node의 번호를 나타내는 number, 간선의 갯수인 relations를 선언했다. 간선을 저장하는 lines에는 대상이 되는 Node의 주솟값을 저장했다. Graph에는 저장하고 있는 Node의 갯수와 Node의 배열을 선언했다. class Node { public: bool mark; int number; i..
[Tip.] Visual Studio에 WSL 연결하기 과제를 리눅스 환경에서 해야 한다던가, 백준의 채점환경에서 컴파일을 하고자 할 때 WSL에 코드를 붙여넣어 테스트를 해보곤 한다. 하지만 복사, 붙여넣기가 깔끔하게 되지 않아 주석을 모두 지우고 붙여넣어야 하는 수고로움이 있는데, 아에 비주얼 스튜디오에 WSL을 연동시키면 깔끔하지 않을까 싶어서 알아보니 방법이 있었다. * 실은 1학년 전공 수업 때 배웠던 기억이 있다. 우선, 제어판에서 WSL 기능을 켜야 한다. 제어판에 들어간다. "프로그램" 메뉴를 클릭한다. "Windows 기능 켜기/끄기"를 누른다 Linux용 Windows 하위 시스템"에 체크가 안 돼 있다면 체크를 한다. 이제, WSL을 설치한다. 이는 Microsoft Store에서 검색해 설치하면 된다. 여러가지 버전이 나열되어 있을텐데,..
[C++] 백준 1463번: 1로 만들기 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 개요 이 문제는 "다이나믹 프로그래밍" 알고리즘으로 분류돼 있다. 관련하여 찾아보니, 재귀함수를 활용하는 것과 많이 비교된다. 한 번 계산한 것은 다시 계산하지 않는 것이 목표인 것이다. 이 문제에서도 마찬가지다. 틀린 풀이 어떤 수 X가 3으로 나누어 떨어지면, X / 3에 대한 계산은 이미 저장돼 있을 것이라 기대할 수 있다. 만약 X == 10일 경우, X가 2로 나누어 떨어지지만 2로 나누기 시작하여 1로 만드는 것보다 1을 뺀 이후 3으로 나누는 것이 더 적은 횟수의 연산을 할 수 있음을 알 수 있다. 따라서, X가 2 또는 3으로 나누어 떨어진다면, X - 1일 때..
[C++] 백준 18111번: 마인크래프트 문제 바로가기 이 문제 걸핏보면 어려워 보이지만 처음 구현했을 때는 술술 나올 정도로 어렵진 않았다. 알고리즘 분류가 브루트포스 알고리즘으로 돼 있길래, 맘 편하게 코드를 짰다. worst case도 입력해주며 코드를 고쳐나갔다. 누락됐던 블럭을 부수면 인벤토리에 블럭을 추가하는 것도 추가시키고, 블럭이 지금 모자르다고 바로 break를 걸었던 것도 최종 결과에 따라 반영했다. 인벤토리에 블럭을 증가/감소시킨 양 만큼 변화하도록 수정하는 등 다양한 수정을 거쳤다. 코드에 주석까지 하나하나 달아가며 검토했지만, 제출한 코드의 결과는 "틀렸습니다" 아래가 해당 코드다. #include #include int main() { int N, M, B; scanf("%d %d %d", &N, &M, &B); int..
[C] 백준 풀 때 Tip. 답안 검토 시 파일로 입력 넣기 백준 풀면서 답안을 검토할 때 하는 것 중 하나가 입력의 최대치를 넣어보는 것이다. 이를 통해 시간초과가 발생할지, 값이 이상해지지는 않는지 확인할 수 있다. 하지만, 입력이 100만개씩 되는 경우가 있는데 이를 복사&붙여넣기를 하거나 일일이 입력할 수도 없는 노릇이다. 이 때 파일을 통해 입력하면 편하다. 1. 입력파일 생성하기 우선, 입력에 쓰일 파일을 만들 코드를 짜야한다. 18111번: 마인크래프트를 예시로 하면, 입력 코드를 아래처럼 구성할 수 있다. #include int main() { printf("500 500 6500000\n"); for (int i = 1; i [원하는 경로]\Input.txt 왼쪽 경로는 해당 소스파일을 컴파일 한 뒤의 생성된 파일이다. 가운데에는 '>'를 공백을 ..
[C++] 백준 2805번: 나무 자르기 문제 바로가기 이 문제는 1654번: 랜선 자르기와 비슷하다. 그 때에도 탈출조건 때문에 애를 먹었다. 하지만 그 때 되짚어 봤던 것처럼, HIGH(또는 RIGHT)에는 MID - 1을, LOW(또는 LEFT)에는 MID + 1을 대입하고 while문의 조건을 HIGH ≥ LOW로 하면 무한루프에 빠지지 않는다. 또는 HIGH, LOW = MID로 하되, HIGH > LOW + 1을 while문 조건으로 해도 상관없다. 둘은 사실상 같은거다. 이 문제를 풀면서 이를 잊고 있다가 무한루프로 인한 시간초과가 두 번이나 발생했다. 공식처럼 익혀 놓아야겠다. #include int main() { int N, M, MID; scanf( "%d %d", &N, &M); int LOW = 0; int HIGH = ..
[C++] 백준 15829번: Hashing 1. Small (50점) 서브태스크 Small(50 점)에 대한 해답은 어렵지 않다. 각 문자에 대해서 int 형식으로 변환하여 31를 인덱스만큼 거듭제곱한 것을 곱하고 합한 값을 1234567891로 나눈 나머지를 출력하면 된다. 1 ≤ L ≤ 5일 때는 int로도 충분히 풀 수 있을 정도로 숫자가 크지 않다. #include using namespace std; int pow(int num, int p) { int result = 1; for (int i = 0; i < p; i++) { result *= num; } return result; } int main() { int L; scanf("%d", &L); char* str = new char[L + 1]; scanf("%s", str); i..