Skip to content

Conversation

Gyulguma
Copy link

@Gyulguma Gyulguma commented Apr 9, 2025

🚀 싸피 15반 알고리즘 스터디 12주차 [유병규]

📌 문제 풀이 개요

  • 이번 PR에서는 다음 5문제의 풀이를 포함합니다.
  • 각 문제에 대한 풀이 과정과 접근 방식을 설명합니다.

✅ 문제 해결 여부

  • 틱택토
  • 미친 로봇
  • 입국심사
  • 호석이 두 마리 치킨
  • 양팔저울

  • 소트 게임
  • 행렬 곱셈 순서
  • 최대공약수 하나 빼기

💡 풀이 방법

문제 1: 틱택토

문제 난이도

  • 골드 5

문제 유형

  • 구현, 많은 조건 분기

접근 방식 및 풀이

  • 틱택토: 3x3 격자판에서 X, O를 번갈아 놓으며 이때 X를 항상 먼저 놓는다.
  • 틱택토 게임이 종료되는 조건은 다음과 같습니다.
    • 어느 한 사람의 말이 가로, 세로, 대각선 방향으로 3칸을 잇는데 성공
    • 게임판이 가득 참
  • 주어진 게임판의 상태가 틱택토 게임이 종료되었을 때 나올 수 있는 상태인지 판별하는 문제였습니다.
  • 각 경우의 수를 나누어 바로 판단할 수 있다면 결과를 저장하고 판단할 수 없다면 직접 시뮬레이션을 해서 결과를 판단하는 방법으로 문제를 해결하였습니다.
  • 각 분기를 직접 확인하는 것과 시뮬 코드가 같이 들어가 있어 코드가 매우 길게 작성되었습니다. 좀 더 차분히 생각했으면 훨씬 깔끔하고 간단한 코드가 나왔을 것 같습니다.

문제 2: 미친 로봇

문제 난이도

  • 골드 4

문제 유형

  • 수학, 브루트포스, DFS, 백트래킹

접근 방식 및 풀이

  • 로봇이 동서남북 4개 방향 중 하나의 방향으로 한 칸 이동한다. N번을 움직였을 때 이동 경로 중 같은 칸을 두 번 이상 밟지 않았을 때 로봇의 이동 경로는 단순하다고 한다. N이 주어질 때 이동 경로가 단순할 확률을 구하라.
  • 위 설명을 보고 처음에는 이동경로가 단순하지 않는 경우의 수가 더 적을 것이라 생각해 해당 확률을 구한 뒤 1에서 빼는 방법을 생각했습니다. 하지만 오히려 경우의 수가 훨씬 많았고 이동경로가 단순한 경우의 확률을 구해 문제를 해결하였습니다.
  • double의 값이 너무 작아져 1.220703125E-4 형태로 출력이 되어 BigDecimaltoPlainString()을 사용해 해결할 수 있었습니다.

문제 3: 입국심사

문제 난이도

  • 골드 5

문제 유형

  • 이분 탐색, 매개 변수 탐색

접근 방식 및 풀이

  • N개의 입국 심사대와 각 심사대별 소요 시간이 주어질 때 M명이 모두 심사를 통과할 때까지 걸리는 최소 시간을 구하라.
  • 이분 탐색인지 모르고 단순 구현으로 문제를 접근하였지만 시간 초과가 났습니다. 이후 이분 탐색으로 접근하였고, 걸리는 시간을 기준 값으로 잡아 해당 시간 동안 총 몇 명을 처리할 수 있는 지를 파악하여 문제를 해결할 수 있었습니다.
  • counting을 하는 중간에 만약 m보다 많다면 반복문을 그만두도록 조건문을 추가했는데 이 조건문이 없다면 counting 메소드의 count값이 long범위를 넘어설 수 있기 때문에 주의해야합니다.

문제 4: 호석이 두 마리 치킨

문제 난이도

  • 골드 4

문제 유형

  • 브루트포스, 최단 경로, 플로이드-워셜

접근 방식 및 풀이

  • $N$개의 건물과 $M$개의 도로가 있고 이 중 2개를 선택해 치킨 집을 차릴 때 모든 건물로부터 치킨 집까지의 접근성이 최소가 되는 치킨 집 위치와 그 때의 접근성의 총합을 구하라.
  • 접근성: 가장 가까운 치킨 집까지의 왕복 거리
  • 요구 사항 중 $N ≤ 100$ 이었기 때문에 완전 탐색으로 해결해도 가능하다고 판단했습니다. 그래서 플로이드 워셜 알고리즘으로 모든 노드에서 모든 노드로의 최단 거리를 구한 후 2개의 치킨 집을 선택하여 최단인 경우를 파악하며 문제를 해결할 수 있었습니다.
  • 이때 0 based-indexing으로 구현하였으며, 문제의 정답을 작은 번호가 더 작은 것, 작은 번호가 같을 경우 큰 번호가 더 작은 거를 출력해야 하기에 반복문으로 해결하였습니다.

문제 5: 양팔저울

문제 난이도

  • 골드 3

문제 유형

  • DP, 배낭 문제

접근 방식 및 풀이

  • N개의 추와 각 추의 무게가 주어지고 M개의 구슬과 무게가 주어질 때 추를 사용하여 각 구슬의 무게를 확인할 수 있는지 구하여라.
  • 처음에는 추로 확인할 수 있는 모든 무게를 Set에 저장하고 구슬의 무게가 추에 포함되는 지 여부를 파악하는 식으로 접근하였는데, 메모리 초과로 해결하지 못했습니다.
  • 그래서 DP로 접근하였습니다. 배낭 문제와 유사하게 DP 배열을 정의하여 문제를 해결하였습니다.
  • DP[N][M] = 만들 수 있는 경우의 수
    • N: N번째 추까지 사용했을 때
    • M: 만들 수 있는 무게
  • 처음 풀이 방법에서 자료구조를 DP로만 변환하면 되었기에 비교적 쉽게 점화식을 구할 수 있었습니다.

문제 6: 소트 게임

문제 난이도

  • 골드 4

문제 유형

  • 자료 구조, BFS, 해시/트리를 이용한 집합과 맵

접근 방식 및 풀이

  • $1$부터 $N$까지 정수로 이루어진 $N$자리의 순열을 사용한다. $K$가 주어고 어떤 수를 뒤집으면, 그 수부터 오른쪽으로 $K$개의 수를 뒤집어야 한다. 주어진 수열을 오름차순으로 정렬하기 위해 최소 몇 개의 수를 선택해야 하는 지 구하라.
  • 주어진 수열을 배열에 저장한 후 직접 swap을 수행하고 Arrays.toString()을 통해 중복 체크를 하는 방법으로 접근하였습니다.
  • 뒤집는 카드의 기준을 $0$부터 $N-K-1$ 인덱스까지 선택하며 각 경우에 swap을 수행했습니다. 이때 swap한 배열이 이전에 나왔던 배열이라면 그 배열에 대해서는 더 이상 수행을 하면 안 되므로 이를 판단하기 위해 HashSet<String>을 사용했습니다.
  • 처음에는 위 내용을 DFS로 구현했지만 스택 오버플로우가 발생하였고, 대신 BFS로 구현하여 해결할 수 있었습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant