정보올림피아드 (햄버거 문제)
개요
안녕하세요.
학원생 중 정보올림피아드 대회를 준비하는 심화반 학생이 있어 같이 풀어본 문제입니다.
먼저 문제를 살펴보겠습니다.
|
|
[출처 : 한국정보올림피아드, 2020년 중등부 2교시 문제] |
예를 들어 입력이 아래와 같다면,
12 1
HPHPHPHHPPHP
출력은 아래와 같아야 합니다.
5
K가 2 라면 (햄거버를 먹을 수 있는 거리),
12 2
HPHPHPHHPPHP
출력은 아래와 같아야 합니다.
6
문제풀이
1. 왼쪽부터 HPHPHP... 을 진행하며 P(사람)을 검색.
2. 사람(P)을 찾은 경우, 사람인덱스 기준 -K~+K 까지 햄버거 검색.
3. 햄버거가 있다면 (H를 만나면) 먹고, 햄버거 위치에 먹었다는 표시. (예, 'X')
4. 햄버거를 먹었다는 표시를 하는 이유는, 다음 P(사람)이 이미 먹은 햄버거를 또 먹는 것을 방지.
5. 전체적으로 테이블(HPHPHP...)을 반복하는 루프와 테이블 내 사람(P)를 만났을때 -K~+K를 반복하는 이중 루프로 구현.
6. 단, 테이블의 왼쪽에 사람이 있는 경우
-K가 0보다 작은 경우, 테이블의 오른쪽
끝에 사람이 있는 경우,
+K가 테이블의 길이를 초과하는 경우를
주의.
|
|
[햄버거 분배문제 해결 알고리즘] |
소스코드 (파이썬)
x = input('식탁길이, 선택거리:')
y = input('햄버거, 사람 배치(H, P):')
xx = x.split(' ')
#n:식탁길이, k:거리
n = int(xx[0])
k = int(xx[1])
yy = list(y)
p = 0
for i in range(n):
if yy[i] == 'P':
if i-k<0:
start = 0
else:
start = i-k
if i+k+1>n:
end = n
else:
end = i+k+1
for j in range(start, end):
if yy[j] == 'H':
p += 1
yy[j] = 'X'
break
print(p)
|
| [파이썬 출력] |
소스코드 (C++)
#include <iostream>
#include <string>
int main()
{
int n, k;
std::cin >> n >> k;
std::string s;
std::cin >> s;
int p = 0;
int start = 0, end = 0;
for (int i = 0; i < n; i++)
{
if (s[i] == 'P')
{
if (i - k < 0)
start = 0;
else
start = i - k;
if (i + k + 1 > n)
end = n;
else
end = i + k + 1;
for (int j = start; j < end; j++)
{
if (s[j] == 'H')
{
p += 1;
s[j] = 'X';
break;
}
}
}
}
std::cout << p << '\n';
}
|
| [C++ 출력] |
파이썬, C++ 둘 다 결과는 같습니다.
감사합니다.




안녕하세요. pyqt를 사용해 일반 상용 프로그램처럼(예를 들어 파이참 등) 소프트웨어를 만들고 싶은데 어떻게 만들어야 하는지 감이 잘 안 잡혀서 질문드립니다. 필요기능은
답글삭제1. 인스톨 파일로 설치해야 한다.
2. 프로그램을 켰을 때 업데이트가 있다면 업데이트를 적용해야한다.
3. 프로그램을 완전히 닫지 않는다면 작업표시줄 오른쪽 화살표를 누르면 나오는 공간에 항상 실행될 수 있게 한다.
4. 프로그램 안에서 부분적으로 기능을 다운받을 수 있게 한다.
이정도입니다. c++은 예전에 direct까지 다뤘었는데 지금은 기억이 잘 안나고, 파이썬은 어느 정도 다룰 줄 알고 웹쪽은 django를 어느 정도 다룰 줄 압니다.
경제적 여건만 되면 직접 내려가서 수업을 받고 싶은데 서울에 거주하다보니 지금은 힘드네요. 혹시 위 프로그램을 만드는데 도움이 될만한 강의나 책도 추천해주시면 감사하겠습니다.
블로그 게시물과 관련된 내용 외에는 답변드리지 않음을 양해 바랍니다.
삭제참고로 C++은 블로그에 추천해둔 책들을 다 이해한다면 중급개발자 이상이며, 파이썬은 추천할 정도의 책은 저도 아직 경험해본 적이 없습니다.
감사합니다.