
문제 보기 이 문제는 시뮬레이션 문제이다. (시뮬레이션 구현을 위해 노가다가 필요하다..) 문제에서 요구하는 바는 주어진 순서대로 큐브를 회전시켰을 때의 상태를 구하는 것이다. 문제를 푸는 로직 자체는 매우 쉽지만, 이를 구현하기 위한 방법이 매우 까다롭다. 먼저, 나는 문제를 풀기 위해 다음과 같이 큐브의 전개도를 구성하였다. 이 전개도는 가상의 위치로써, 큐브가 회전하더라도 어떻게 큐브가 회전하였는지 우리가 알기 쉽게 도와준다. 이 전개도를 구현하기 위해 나는 cube라는 3차원 리스트 변수를 두었고, 다음과 같이 구성하였다. 즉, cube는 3*3 2차원 배열을 6개 가진 변수이다. 큐브의 각 칸에 대한 숫자들은 나중에 큐브가 회전할 때 우리가 쉽게 이해하기 위해 임의로 둔 숫자이다. 이제 우리는 ..

문제 보기 이 문제는 BFS와 시뮬레이션 문제이다. 갈수록 삼성 SW 역량 테스트의 문제가 점점 더 구현에 까다로운 조건을 추가하기 시작하는 게 느껴진다. 먼저, 문제를 풀기 위해 원판의 숫자를 어떻게 표현할 것인지에 대해서 생각해보아야 한다. 문제에서 주어진 원판을 행렬로 표현하면 다음과 같다. 이제 원판을 행렬로 나타냈으니, 원판을 회전시키는 함수를 작성한다. i번째의 원판을 회전시킬 때, i의 배수인 원판 모두 회전을 시켜야 한다. 이 부분에 대한 구현은 13~27번째 줄에 다음과 같이 구현되어 있다. def rotate(_x, _d, _k): # rotate counter-clockwise if _d: # for all disks which is multiple of x for i in range..

문제 보기 이 문제는 알고리즘 분류는 되어있지 않지만, 시뮬레이션 문제라고 생각한다. 갈수록 삼성의 SW 역량 테스트가 점점 어려워지는 게 느껴진다. 개인적으로 문제를 읽자마자 스택/큐의 개념이 떠올랐지만, 막상 파이썬으로 구현하니 스택/큐를 쓸 일이 없었다. 또한 C/C++의 포인터를 쓰고 싶었지만, 파이썬에는 포인터의 개념이 없기 때문에 해결법을 구상하는데 꽤나 오랜 시간이 걸렸다. 문제를 풀기 전, 중요한 변수가 3개 있다. board_info: 체스판의 색깔 정보를 담고있는 변수 board: 체스판 위의 체스말 정보를 담고 있는 변수 chess_pieces: 체스말 리스트 (각 체스 말의 행, 열과 방향을 담고 있다.) 이를 가지고 문제를 해결하였다. 문제를 푼 로직은 다음과 같다. 체스 말이 다..

문제 보기 이 문제는 시뮬레이션 문제이다. 처음에 문제를 읽자마자 든 생각은 두 가지였다. collections 모듈의 Counter 자료구조를 사용해야겠다. 행과 열에 대한 연산이 있으므로, 열에 대한 연산은 A 행렬을 transpose 시켜야겠다. 이 두 가지 생각을 잘 구현하니 AC를 받았다. 문제를 푼 로직은 다음과 같다. 행렬 A를 초기 상태의 3 * 3 행렬로 초기화한다. (5~9번째 줄) R연산) A의 각 행마다 (숫자, 숫자가 나타난 횟수)의 리스트를 생성하고, 그 리스트에 대해 (숫자가 나타난 횟수, 숫자) 순으로 오름차순으로 정렬한다. (17번째 줄) R연산) 정렬된 0이 아닌 숫자들을 해당하는 A의 행에 새롭게 대입시킨다. (19~24번째 줄) R연산을 통해 바뀐 열의 최대 길이를 갱..

문제 보기 이 문제는 시뮬레이션 문제이다. 생각보다 쉬워보였는데 문제를 해결하는데 하루 2시간씩 총 3일이 걸렸다. (정말 바보같았다.) 처음에는 객체지향적으로 상어 클래스를 만들고 상어들의 배열을 만들어서 선형적인 시간복잡도로 문제를 해결하려고 했지만, 딱히 그럴 필요가 없을 것 같아서 그냥 2차원 배열의 각 원소들에게 상어의 정보를 할당하였다. 문제를 푼 로직은 다음과 같다. 2차원 배열에 상어에 대한 정보를 저장한다. (30~33번째 줄) 어부를 이동시킨다. (38~39번째 줄) 낚시왕이 있는 열에 있는 상어 중에서 땅과 제일 가까운 상어를 잡는다. 상어를 잡으면 격자판에서 잡은 상어가 사라진다. (40~45번째 줄) 상어가 이동한다. (각 상어가 이동할 때마다 이동한 상어의 정보를 새로운 2차원 ..

문제 보기 이 문제는 시뮬레이션 문제이다. 처음에 문제를 훑고 나서 BFS 문제라고 생각했지만, 자세하게 문제를 읽어보니 나무 재테크와 비슷한 문제였다. 문제를 풀 때 주의할 점은 먼지를 확산시킬 때, 먼지를 확산시킬 칸들의 정보를 저장해두었다가, 모든 칸의 먼지의 양을 줄이고 나서 확산시켜야 한다. (이는 나무 재테크 문제에서처럼 똑같이 적용되는데, 각 칸을 순회할 때 먼지를 확산시켜 먼지의 양을 주변 칸에 더해버리면 다음 칸에서 확산시킬 먼지의 양에 영향을 끼친다.) 문제를 푼 로직은 다음과 같다. 공기청정기의 위치를 찾는다. (8~12번째 줄) 각 칸에서 미세먼지를 확산시킬 인접한 칸들을 찾고, 그만큼 현재 칸의 미세먼지의 양을 줄인다. 동시에 인접한 칸들의 위치를 큐에 저장한다. (18~32번째 ..
문제 보기이 문제는 시뮬레이션 문제이다.처음에 이 문제에서 요구하는 바가 무엇인지 이해를 하지 못했다.. 그러나 문제를 이해하고 나니 구현은 매우 쉬웠다.드래곤 커브는 다음과 같은 세 가지 속성으로 이루어져 있다. 1. 시작 점2. 시작 방향3. 세대 (Generation) 다음 세대로 넘어갈 때마다 변화하는 드래곤 커브는 문제의 설명을 보면 이해할 수 있다.드래곤 커브의 진행방향은 다음과 같이 정의되어 있다.드래곤 커브의 방향을 살펴보면 다음과 같은 규칙이 있다.0세대: 01세대: 01 -------------- 0 12세대: 0121 ----------- 01 213세대: 01212321 ------ 0121 2321 위의 규칙을 보면, 다음 세대의 드래곤 커브는 현재 세대의 드래곤 커브에서 거꾸로 ..
문제 보기이 문제는 시뮬레이션 문제이다.톱니바퀴의 초기상태와 회전 방법이 주어졌을 때, 최종 톱니바퀴의 상태를 구해야한다. 나는 이 문제를 보자마자 나는 비트마스크를 써야겠다고 생각했다.톱니의 상태를 2진수로 만들고, 이를 시계방향, 반시계방향으로 회전시키는 함수를 만들었다. (10~25번째 줄)12시 방향의 비트를 MSB로 두었고, MSB 바로 왼쪽의 비트를 LSB로 두었다. 10101111 -> 01011111 각 명령마다 톱니바퀴를 선택하고 돌릴 때, solution 함수를 통해 톱니바퀴를 양쪽으로 탐색한다.비트마스크를 사용해서 문제를 풀 때, 여기서 주의해야할 점이 있다. 1. 오른쪽으로 탐색할 때오른쪽 톱니바퀴를 회전시킬지 결정할 때, 오른쪽 톱니바퀴의 2번째 비트와, 왼쪽 톱니바퀴의 6번째 비..
문제 보기이 문제는 시뮬레이션 문제이다.문제를 풀다보니 코드가 점점 더러워지는 느낌이다.. 문제에서 주어지는 조건은 다음과 같다.이 조건들을 잘 따지면 정답을 구할 수 있다. (말은 쉽지만 이 문제 푸는데 아주 오래 걸렸다...) 이 문제를 푸는데 사용한 로직은 다음과 같다.1. 같은 높이의 블럭이 나오면 갯수를 센다. (13~14번째 줄)2. 다음 블럭의 높이가 2 이상 차이나면 조건을 위반하므로 flag를 False로 바꾼다. (29~31번째 줄)3-1. 다음 블럭이 높을때, count와 경사로의 길이를 비교한다. count가 더 작으면 경사로를 놓을 수 없다는 의미이고, count가 경사로의 길이보다 같거나 더 크면 경사로를 놓을 수 있다는 의미이다. 그러므로 경사로를 놓고 count를 1로 초기화..
문제 보기이 문제는 시뮬레이션 문제이다.이 문제를 풀어보니 시뮬레이션에 많이 취약한 것 같다.시뮬레이션 문제는 적혀있는 그대로 구현하는 것이 어려운 게 아니라, 요구사항을 정확히 이해하고 구현하는게 제일 중요한 것 같다. 다음과 같이 문제의 요구사항이 있다.문제에서 요구하는대로 구현하는 것이 어렵지만, 문제의 구현에 집중하다보니 간과한 부분이 있다.입력의 조건에 보면, 다음과 같이 명시되어 있다.사과의 위치는 모두 다르며, 맨 위 맨 좌측 (1행 1열)에는 사과가 없다.즉, 뱀이 시작하는 위치는 (1, 1)로 생각하고 문제를 풀어야 한다는 것이다.이에 주의해서 구현하면 AC를 받을 수 있다. (내 코드로는 메모리와 시간이 꽤나 걸린다.. 추후에 더 개선 해야겠다.) 123456789101112131415..
- Total
- Today
- Yesterday