본문 바로가기

반응형

공부/알고리즘 문제풀이

(96)
[삼성 기출 문제] 백준 14891 톱니바퀴 문제 링크 어떻게 풀까? 전형적인 시뮬레이션 문제입니다. 문제의 내용을 그대로 구현해야합니다! 먼저 생각해보아야 할 것은 톱니바퀴의 극을 어떻게 설정할 것인가? 입니다. 톱니바퀴는 N극과 S극의 2 가지 상태로 나타낼 수 있습니다.그리고 톱니가 8개이기 때문에, 비트로 나타내면 편하게 관리할 수 있을 것 같습니다! 시계 방향과 반시계 방향도 비트 연산자 하나만으로 해결 될 수 있죠! 123456789101112131415161718192021222324252627282930313233struct TOP { int topni; bool getUP() { return topni & 1; } bool getRIGHT() { return topni & (1
[삼성 기출 문제] 백준 14890 경사로 문제 링크 어떻게 풀까? 이 문제의 핵심은 '경사로를 어떻게 놓으면 될까?'에 대한 결정을 하는 것입니다. 문제에경사로의 가로 길이가 2라고 하겠습니다. 땅의 상황은 위와 같다고 하겠습니다. 아래와 같은 경우는 경사로가 설치된 곳에 중복으로 경사로를 설치했기 때문에 나타나는 문제입니다! 이 문제를 해결하기 가장 좋은 방법은 해당 좌표에 이미 경사로가 설치되었는지를 나타내는 bool 배열을 이용하는 것입니다. 해당 지점에 최초로 경사로를 만들면, 해당 자리를 true로 만듭니다. 다음에 또다시 해당 지점에 경사로를 만들려고 한다면, 경사로를 만들 수 없는 것입니다! 위의 그림을 봅시다. 위의 그림은 경사로가 지어지는 도중에 겹쳐지는 곳이 있어서 결국 경사로를 짓지 못한다는 처리를 해줘야합니다. 하지만, 경..
[삼성 기출 문제] 백준 14889 스타트와 링크 문제 링크 클릭시 이동합니다. 어떻게 풀까? 를 구하는 문제입니다. n 개의 데이터를 스타트 팀, 링크 팀에 넣은 뒤에 두 팀의 능력치를 계산해서 두 능력치의 차이 중 최소의 값을 출력합시다! 참고로, 능력치는 입력에 주어지는 것 처럼 2차원 배열에 저장하실 겁니다!팀의 능력치를 구할 때, i, j가 같은 팀이면 능력치를 (i,j)와 (j,i)의 합으로 구할 수 있습니다!즉, 1번 사람과 2번 사람이 팀이라면, (1,2)와 (2,1)를 더해서 구하면 됩니다! 2차원 for문을 이용하면 1번 사람과 2번 사람의 경우와 2번 사람과 1번 사람의 경우 두 개를 중복으로 확인할 것입니다.이를 피하기 위해서 j는 i+1번 번호 부터 확인하도록 합시다! 저는 비트조합을 이용해서 조합을 구했는데, 이를 확인하시려면 ..
[삼성 기출 문제] 백준 14888 연산자 끼워넣기 문제 링크 클릭시 문제로 이동합니다. 어떻게 풀까? 다행히도 연산자의 우선 순위가 모두 같기 때문에, 앞에서부터 차례차례로 처리하면 됩니다! 그리고, 더하기, 빼기, 곱하기, 나누기 연산의 개수가 나옵니다.그렇다는 것은, 현재 계산된 수에서 다음 수를 더하기, 빼기, 곱하기, 나누기 중 하나를 선택하고, 다음 수와 계산한 뒤에, 이렇게 계산된 수와 최댓값, 최솟값을 비교해서 계속 갱신해줍시다. 이렇게 모든 경우의 수를 다 구해서 저장된 최댓값과 최솟값을 출력하면 문제의 답을 출력할 수 있습니다! 3 3 4 5 1 0 1 0 위 예제를 통해서 한번 살펴봅시다. 처음에 더하기의 개수가 존재하기 때문에, 더하기의 개수를 하나 깎은 후에 3과 4를 더합니다. 다음에 더하기와 빼기의 개수가 0개이므로, 이 부분들..
[삼성 기출 문제] 백준 14503 로봇 청소기 문제 링크 클릭시 문제로 이동합니다! 어떻게 풀까? 전형적인 시뮬레이션 문제입니다!문제에서 요구하는 것들을 잘 분석해서 순서에 유의해서 잘 구현하면 됩니다!! 이 문제에서 조금 생각해봐야할 부분은 로봇 청소기가 청소를 종료해야하는 상태와 후진해야하는 상태를 구분해야한다는 것입니다. 그래서 저는 상태를 다음과같은 3가지 상태로 표현했습니다.-1: 청소를 종료해야함- 4 방향 모두 청소가 되어있는데, 뒤가 이동 불가능한 지역 1 : 청소기가 이동함.- 4 방향 중 청소가 안된 방향으로 이동- 4 방향 모두 청소가 되어있어서 현재 바라보는 방향에서 뒤 칸으로 이동 2 : 청소가 이미 되어있어서 청소가 안된 곳 발견 필요 상태가 -1이 나오면, 함수에서 return값으로 현재까지 청소한 구역의 개수를 반환합니다..
[삼성 기출 문제] 백준 14502 연구소 문제 링크 클릭시 이동합니다. 어떻게 풀까? 문제를 크게 2 부분으로 나눠야 합니다. 1. 벽을 3개 세우는 부분2. 바이러스를 퍼뜨리는 부분 1번은 dfs를 이용해서 조합을 이용해서 해당 좌표에 벽을 세운다 or 안세운다 의 동작을 통해서 모든 구역에 벽을 3개씩 세워보는 방법을 이용합니다. 그리고 벽을 3개 세웠을 때, bfs를 이용해서 2번을 동작해서, 바이러스의 개수를 세서 이 최댓값을 출력하면 풀이는 완료됩니다! 2차원에서 조합을 이용하는 방법을 알아봅시다! n = 3이라고 하겠습니다. 시작은 (0,0) 입니다.우선, (0,0)에 벽을 세울지 안 세울지 정합니다. 우선 세운다고 가정하겠습니다. 그럼, 열의 크기를 1 늘려준 뒤에 해당 위치에서 다시 위의 과정을 반복합니다.이번에는 안세운다고 하겠..
[삼성 기출 문제] 백준 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..

반응형