본문 바로가기

분류 전체보기

(109)
[C++] 백준 1193번: 분수찾기 문제 바로가기 문제에서 주어진 표는 다음과 같다. 1/1 1/2 1/3 1/4 1/5 … 2/1 2/2 2/3 2/4 … … 3/1 3/2 3/3 … … … 4/1 4/2 … … … … 5/1 … … … … … … … … … … … 각 대각선에서 분모는 ↗ 방향으로 증가하고, 분자는 ↙ 방향으로 증가한다. 주어진 표에서 방문 순서대로 값을 메기면, 1 2 6 7 15 … 3 5 8 14 … … 4 9 13 … … … 10 12 … … … … 11 … … … … … … … … … … … 사실 나는 문제를 제대로 읽지 않아, 아래처럼 생각했었다. 1 2 4 7 11 … 3 5 8 12 … … 6 9 13 … … … 10 14 … … … … 15 … … … … … … … … … … … 하지만 결정적으로 이러한..
[C++] 백준 2941번: 크로아티아 알파벳 문제 바로가기 처음에는 문자열 입력을 받고, 각 크로아티아 알파벳 마다 문자열 내에서 찾아, 0 등의 임의문자로 대치한 후 총 알파벳 수를 세아리려고 했다. 하지만, 그렇게 하면 반복을 많이 하기 때문에, 문자열의 첫 글자부터 시작하여 한 글자씩 크로아티아 알파벳에 해당하는지 확인하기로 했다. 그러기 위해 switch-case를 이용했다. 큰 틀에서 for문으로 각 문자를 확인한다. 문자에 도달하면 일단 수를 세어준다. 이제, 크로아티아 알파벳에 해당하는지 검사하는데, 크로아티아 알파벳에 해당하면 그 길이만큼 인덱스를 건너 뛴다. 예를 들어 dz= 같은 경우는 인덱스를 두 문자 건너 뛰는 방식이다. 이 문제를 풀며 두 번의 실수가 있었다. 아래 코드는 첫 번째 실수이다. switch-case의 이해 부족..
[C++] 백준 1074번: Z 문제 바로가기 이 문제를 재귀함수를 통해 풀 수 있을 것이라 생각했다. 큰 영역에서 시작해서 한 변의 길이를 절반씩 줄여나가며 그 길이가 2가 됐을 때, 네 칸에 Z 순서로 방문하여 순서를 저장하는 방식으로 코드를 구현했다. 다음 코드가 이 방식을 나타낸 코드 전문이다. #include using namespace std; // pivot: [r, c], interval : [2^N, K] void move(int* table, int* pivot, int* interval, int& order) { // Step 1. If interval is minimum, Mark. if (interval[1] == 2) { int delta[4][2] = { {0, 0}, {0, 1}, {1, 0}, {1, 1}..
[C++] 백준 2630번: 색종이 만들기 문제 바로가기 처음 이 문제를 풀 때는 재귀함수를 사용하지 않으려고 했다. 재귀함수를 사용하지 않고 반복문을 사용하여 잘게 쪼개는 방식으로 하려고 했지만, 마음처럼 되지 않아 재귀함수로 돌아왔다. int area = N * N; int* square = new int[area]; for (int i = 0; i > square[i]; N * N 크기의 int 배열을 동적으로 할당하여, 종이의 색을 저장했다. int count[2] = { 0, 0 }; // { W, B } int sides[2] = { N, N }; count 배열의 첫 번째 요소는 흰 색종이의 갯수를, 두 번째 요소는 파란 색종이의 갯수를 저장한다. sides는 한 변의 길이를 저장하는 배열로, 첫 번째..
[Tip.] VS에서 오류나 경고없이 빌드 실패 오류가 뜰 때 1. 도구 - 옵션 - 프로젝트 및 솔루션 - 빌드 및 실행에서 MSBuild 프로젝트 빌드 출력의 세부 정보 표시를 매우 자세히로 설정 2. 솔루션 탐색기에서 솔루션에 우클릭 후 파일 탐색기에서 폴더 열기 클릭. 파일탐색기 옵션 중 보기 - 숨김 항목에 체크 후 .vs 폴더 삭제 후 비주얼 스튜디오를 재시작 하면 된다.
[C++] 백준 2667번: 단지번호붙이기 이제 어느정도 너비 우선 탐색 유형에 익숙해졌다. 이 문제에선 단지 수를 나타내는 변수 max_block와 단지별 집의 수를 저장할 house_count를 선언하고, 처음부터 스캔을 하며 1인 칸부터 탐색을 실시했고, 탐색을 시작할 땐 max_block에 1씩 더해주었다. 그리고 지나가는 칸 마다 max_block - 1의 값을 대입하고 house_count의 max_block - 1번 인덱스에 1을 더해준다. 이를 새로운 칸을 발견하지 못 할 때까지 반복하면 금방 끝난다. 마지막 출력을 할 땐, house_count를 오름차순으로 정렬해주고 출력하면 끝난다. #include #include #include using namespace std; int main() { int N; scanf("%d", &..
[C++] 백준 7576번: 토마토 문제 바로가기 이 문제도 2178번: 미로탐색처럼 BFS(너비 우선 탐색)을 활용하는 문제다. 미로탐색의 코드를 활용해서 이 문제를 해결하고자 했는데, 시간초과가 발생했다. 처음에는 현재 박스와 하루가 지나 변화된 박스를 구별하여 두개의 배열을 이용했다. 변화된 박스 배열을 현재 박스 배열에 덮어쓰는 방식으로 했더니 연산량이 과했나보다. 그래서 처음부터 다시 생각했다. 박스를 두 개 생성하는게 아니라, 큐를 두 개 생성했다. 하나는 오늘 익을 토마토들(today), 나머지 하나는 내일 익을 토마토들의 좌표들(tomorrow)이다. 처음에는 각 칸의 상태를 입력받으며 tomorrow에 1인 칸을 담는다. int M, N; scanf("%d %d", &M, &N); int* tomatos = new int[..
[C++] 백준 2178번: 미로 탐색 문제 바로가기 그래프 탐색이라는 개념이 아직은 낯설어서 응용하기가 어렵다. 이 문제에서는 행렬구조가 입력되는데, 각 boundary를 처리하는데 애를 좀 먹었다. 문제를 풀면서 좌표를 활용할 생각을 못 했는데, 질문 검색을 통해 힌트를 좀 얻었다. 또한, 인터넷 검색을 통해 이 문제에 대한 답을 살펴봤다. 나는 다음 몇가지를 생각해내지 못 해서 이 문제를 푸는데 어려움이 있었다. 행렬을 좌표로 표현하기 해당 칸까지의 누적거리를 저장하는 배열 아래 코드에서 BFS를 실행하는 while문의 구조는 대략 아래와 같다. 우선, while문은 BFS가 비어있지 않으면 계속 동작한다. 그 이후엔 이미 방문한 칸이 아닐 때까지 pop을 반복한다. mileage(누적거리)의 값이 -1일 경우 방문하지 않은 경우이다. ..