generated from just-the-docs/just-the-docs-template
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- jekyll liquid filter로 자동으로 양식대로 변경되도록 변경
- Loading branch information
Showing
8 changed files
with
146 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
--- | ||
title: 백준 1188 | 음식 평론가 | ||
level: GOLD IV | ||
layout: default | ||
parent: 문제 풀이 | ||
--- | ||
{% assign title = page.title | split: " | " %} | ||
{% assign name = title[0] %} | ||
{% assign title = title[1] %} | ||
{% assign number = name | split: " " %} | ||
{% assign number = number[1] %} | ||
|
||
# **{{ title }}** | ||
{: .no_toc .fs-9 } | ||
|
||
{{ name }} | ||
{: .fs-4 .d-inline } | ||
|
||
{% if page.level contains 'BRONZE' %} | ||
{{ page.level }} | ||
{: .label .label-bronze } | ||
{% elsif page.level contains 'SILVER' %} | ||
{{ page.level }} | ||
{: .label .label-silver } | ||
{% elsif page.level contains 'GOLD' %} | ||
{{ page.level }} | ||
{: .label .label-gold } | ||
{% elsif page.level contains 'PLATINUM' %} | ||
{{ page.level }} | ||
{: .label .label-platinum } | ||
{% endif %} | ||
|
||
<br/> | ||
|
||
1. TOC | ||
{:toc} | ||
|
||
--- | ||
|
||
## 문제 내용 | ||
{: .fw-700 } | ||
|
||
![problem.png](../assets/screenshots/b{{ number }}.png) | ||
|
||
#### [문제 링크](https://www.acmicpc.net/problem/{{ number }}) | ||
{: .no_toc .fs-4 } | ||
|
||
## 해결 방안 | ||
{: .fw-700 } | ||
|
||
<div class="code-example" markdown="1"> | ||
문제에 따르면 특정 열의 스위치를 누르면 해당 열의 램프의 전원이 반대가 되고, 우리는 K번 스위치를 눌러 켜진 행이 최대가 되는 시점을 찾아야 한다. | ||
켜져있는 행이 있을 때 어느 스위치를 누르던 켜져있던 행이 사라지므로, 켜진 행을 하나 완성했을 때 동시에 켜진 행의 개수가 최대인 시점을 찾아야 한다. | ||
임의의 두 행에 대하여 하나의 행이 켜질 때 다른 행도 켜지려면, 스위치를 누르기 전에 이미 켜져있던 램프의 위치와 개수가 서로 같아야 하므로 두 행은 완전히 동일해야 한다. | ||
결론적으로, 하나의 행에 대해 완전히 동일한 행의 개수가 곧 동시에 켜지는 행이므로, 임의의 행과 동일한 행의 개수가 최대가 되는 시점이 켜질 수 있는 행의 최댓값이다. | ||
때문에, 본 문제는 애드 혹(ad hoc) 문제로 분류되었다. | ||
|
||
{: .note-title } | ||
> 애드 혹(ad hoc) 문제란? | ||
> | ||
> 애드 혹 문제는 그 어원처럼 일반화되지 않은 단순히 현재 문제만을 위한 풀이를 요구한다. | ||
> 이 문제의 경우에는 브루트포스나 DP처럼 각 경우를 탐색하여 찾는 대신 편법과도 같은 특정 풀이가 존재하기에 애드 혹 문제로 분류된다. | ||
</div> | ||
## 풀이 코드 | ||
{: .fw-700 } | ||
|
||
```cpp | ||
#include <iostream> | ||
|
||
using namespace std; | ||
|
||
// 유클리드 호제법 | ||
int gcd(int a, int b) { | ||
if(b == 0) return a; | ||
return gcd(b, a % b); | ||
} | ||
|
||
int main() { | ||
int n, m; | ||
cin >> n >> m; | ||
|
||
// n < m을 만족하는 서로소인 n, m에 대해 n/m만큼 쪼개기 위해서는 반드시 최소 m-1번의 칼질을 해야한다. | ||
// 이는 소세지 여러 개를 하나의 소세지라고 생각하면 반드시 m-1번의 칼질이 필요하다는 것을 알 수 있다. | ||
// n개의 소세지를 자르는 중 소세지 끝이 이미 나뉘어 칼질을 하지 않기 위해서는 n과 m이 서로소의 배수여야 한다. | ||
// 다시 말해, 이미 서로소로 하나의 소세지처럼 잘린 만큼이 n과 m의 공약수만큼 반복되고 있다는 것이다. | ||
// 결론적으로 n과 m이 서로소가 아닌 경우, 쪼개는 비율인 n/m은 약분에 따라 서로소일 떄의 칼질 횟수와 같으며 | ||
// 서로소 대비 n과 m의 최대공약수만큼 소세지의 개수가 배가 되므로, 위의 횟수에 최대공약수 배만큼의 칼질을 더해줘야 한다. | ||
int div = gcd(n % m, m); | ||
m /= div; | ||
cout << div * (m - 1) << endl; | ||
return 0; | ||
} | ||
``` | ||
{: .lh-0 .fw-700 .fs-4 } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters