정보올림피아드 (햄버거 문제)
개요
안녕하세요.
학원생 중 정보올림피아드 대회를 준비하는 심화반 학생이 있어 같이 풀어본 문제입니다.
먼저 문제를 살펴보겠습니다.
[출처 : 한국정보올림피아드, 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++은 블로그에 추천해둔 책들을 다 이해한다면 중급개발자 이상이며, 파이썬은 추천할 정도의 책은 저도 아직 경험해본 적이 없습니다.
감사합니다.