본문 바로가기

반응형

알고리즘 문제풀이

(66)
[삼성 기출 문제] 백준 14503 로봇 청소기 문제 링크 클릭시 문제로 이동합니다! 어떻게 풀까? 전형적인 시뮬레이션 문제입니다!문제에서 요구하는 것들을 잘 분석해서 순서에 유의해서 잘 구현하면 됩니다!! 이 문제에서 조금 생각해봐야할 부분은 로봇 청소기가 청소를 종료해야하는 상태와 후진해야하는 상태를 구분해야한다는 것입니다. 그래서 저는 상태를 다음과같은 3가지 상태로 표현했습니다.-1: 청소를 종료해야함- 4 방향 모두 청소가 되어있는데, 뒤가 이동 불가능한 지역 1 : 청소기가 이동함.- 4 방향 중 청소가 안된 방향으로 이동- 4 방향 모두 청소가 되어있어서 현재 바라보는 방향에서 뒤 칸으로 이동 2 : 청소가 이미 되어있어서 청소가 안된 곳 발견 필요 상태가 -1이 나오면, 함수에서 return값으로 현재까지 청소한 구역의 개수를 반환합니다..
[삼성 기출 문제] 백준 14501 퇴사 문제 링크 클릭시 이동합니다. 어떻게 풀까? 현재가 X일이 지난 상태이고 일을 할 수 있는 상태라고 가정해봅시다!그럼, X일 에서의 의뢰를 수행할 수 있겠죠! 이 일을 할 때 벌어들인 금액이 가장 최댓값이 되기 위해서는 어떻게 해야할까요? 답은 간단합니다! X일 전까지 일했던 금액이 가장 많게 하면 되죠! 현재가 X일이라고 했을 때, X-1+T[X]일의 금액 값과, X-1일까지 마친 금액 + P[X] 값 중 큰 값을 X-1 + T[X]일의 벌이로 기록하는 것입니다!이렇게 하면, n일에 저장된 값을 바로 출력하면 되죠! 이를 위해, 간단한 DP점화식을 만들 수 있죠. 그리고, 인덱스 오류를 피하기 위해서 X +T[X]가 n을 넘어갈 때에는 무시하도록 합시다! 코드 12345678910111213141516..
[삼성 기출 문제] 백준 14500 테트로미노 문제 링크 클릭시 이동합니다. 어떻게 풀까? 블럭들을 보시면 최대 4x4 영역 안에 들어온다는 것을 알 수 있습니다.간단하게, 4x4 영역 안에 블럭에 들어오는 영역이면 1, 아니면 0으로 표시하면,모든 (i,j) 영역에 대해서 위에서 저장한 값을 곱해서 더하면 블럭에 대한 더하기 값을 알 수 있습니다. 이 중 최댓값을 반환하면 되겠죠! 다만 위처럼 배열 인덱스 초과가 나지 않도록 하기위해, 오른쪽과 아래에 0의 값을 가지도록 영역을 더 넓혀서 계산합시다! 테트로미노 사전을 만드는 것이 문제 푸는것 보다 오래 걸리는 문제입니다. 코드 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525..
[삼성 기출 문제] 백준 14499 주사위 굴리기 문제 링크 어떻게 풀까? 시뮬레이션 문제입니다! 문제의 순서를 정확히 파악해서 문제가 요구하는 데로 구현하면 종료됩니다! 특히, 주사위가 돌아갈 때마다 주사위의 면이 어떻게 변하는지, 맵은 어떻게 변하는지를 잘 조절하시면 됩니다! 정육면체가 위, 아래, 왼쪽, 오른쪽으로 이동할때마다 면이 어떻게 변하는지를 switch 문으로 구분해 줍니다. 위나 아래로 굴러갈때에는 아래 그림 처럼 4개의 면을 순서대로 이동하면 되고, 오른쪽이나 왼쪽으로 굴러갈때에는 아래 그림처럼 4개의 면을 순서대로 이동하면 됩니다! 이렇게 회전한 뒤에 맵의 면이 0일 경우와 아닐 경우를 구분해서 주사위 면의 바닥과 맵의 값을 변경해 주시면 됩니다!그리고 주사위의 윗면에 적힌 수를 출력하면 되죠! 다만, 맵의 경계 밖이라면 함수에서 리..
[BOJ] 5623. 수열의 합 문제 링크 어떻게 풀까? 와 의 합만이 나와있기 때문에 곤란함을 느낄 수도 있습니다! 하지만 생각보다 간단하게 풀 수 있죠. 맨 왼쪽 위는 입니다. 그리고 그 다음은 이죠엇! 그런데 아래에 이 있습니다! 이 세개를 한번 잘 요리조리 해봅시다! 우선 입니다.이제 여기서 를 얻을 수 있습니다!! 이제 여기서 2를 나눠주면 완전한 을 얻을 수 있고, 1 행에 있는 모든 내용은 이기 때문에, 모든 를 구할 수 있습니다!! 코드 12345678910111213141516171819202122232425262728293031323334#pragma once#include using namespace std; int arr[2][1000];int main() { ios_base::sync_with_stdio(fals..
[BOJ] 2789. 유학 금지 문제 링크 어떻게 풀까? 주어진 배열에서 C, A, M, B, R, I, D, G, E글자가 아니라면 결과를 출력하기 위한 캐릭터형 배열에 따로 보관해주면 됩니다! 예를 들어보겠습니다! LOVE가 입력으로 들어오면 어떻게 해야할까요!? L은 해당 글자와 상관없기 때문에 res[0]에 넣습니다!O 도 마찬가지이기 때문에 res[1]에 넣습니다!V도 마찬가지이기 때문에 res[2]에 넣습니다!E는 검열되는 글자이기 때문에 버립니다. 그럼 결과는 "LOV"가 됩니다. 코드 12345678910111213141516171819202122232425262728293031323334353637#pragma once#include#include using namespace std; char del[10] = "CAM..
[BOJ] 5622. 다이얼 문제 링크 어떻게 풀까? 단순한 구현문제입니다! 알파벳이 입력되었을때, 해당 알파벳에 해당하는 시간으로 변환해주는 배열을 만들면 쉽게 해결할 수 있습니다! 예를 들면, t['A'] = 3, t['B'] = 3, ... 이렇게 저장해놓으면, UNUCIC 가 들어왔을 때 쉽게 이 문자열을 숫자로 변환해서 더해줄 수 있습니다! 코드 12345678910111213141516171819202122232425262728293031323334#include#include using namespace std; int conv[256];char nums[16]; int main() { for (int i = 0; i > nums; int len = strlen(nums); int t = 0; for (int i = 0..
[BOJ] 12782. 비트 우정지수 비트 우정지수 클릭시 이동합니다! 어떻게 풀까? 할 수 있는 연산은 2개 입니다! 1. 두 수의 위치를 바꾼다.2. 한 수의 비트를 바꾼다. 두 수의 위치를 바꿀 수 있다는 것은, 한 번의 연산으로 두 개의 수를 동시에 고칠 수 있다는 가능성을 가지고 있다는 것이죠. 한 번에 두 수의 비트를 옳게 바꾸는 방법은 무엇일까요!? 만약 바꾸고자 하는 두 수가 같다면, 연산의 의미가 없습니다. 만약, 바꾸고자 하는 두 수의 비트가 다르다고 하더라도, 이미 제대로 된 짝을 가지고 있다면, 바꾸는 의미가 없습니다. 즉, 한 번의 연산으로 두 개의 비트를 똑같게 만들고 싶다면, 위처럼 서로 짝이 맞지 않으면서, 서로 다른 비트를 가지는 두 비트의 자리를 바꿔야 합니다! 지금까지 한 번의 연산으로 서로 다른 두 자리에..

반응형