정보올림피아드 (햄버거 문제)

개요

안녕하세요. 

학원생 중 정보올림피아드 대회를 준비하는 심화반 학생이 있어 같이 풀어본 문제입니다.

먼저 문제를 살펴보겠습니다.

[출처 : 한국정보올림피아드, 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++ 둘 다 결과는 같습니다.

감사합니다.

댓글

  1. 안녕하세요. pyqt를 사용해 일반 상용 프로그램처럼(예를 들어 파이참 등) 소프트웨어를 만들고 싶은데 어떻게 만들어야 하는지 감이 잘 안 잡혀서 질문드립니다. 필요기능은

    1. 인스톨 파일로 설치해야 한다.
    2. 프로그램을 켰을 때 업데이트가 있다면 업데이트를 적용해야한다.
    3. 프로그램을 완전히 닫지 않는다면 작업표시줄 오른쪽 화살표를 누르면 나오는 공간에 항상 실행될 수 있게 한다.
    4. 프로그램 안에서 부분적으로 기능을 다운받을 수 있게 한다.

    이정도입니다. c++은 예전에 direct까지 다뤘었는데 지금은 기억이 잘 안나고, 파이썬은 어느 정도 다룰 줄 알고 웹쪽은 django를 어느 정도 다룰 줄 압니다.
    경제적 여건만 되면 직접 내려가서 수업을 받고 싶은데 서울에 거주하다보니 지금은 힘드네요. 혹시 위 프로그램을 만드는데 도움이 될만한 강의나 책도 추천해주시면 감사하겠습니다.

    답글삭제
    답글
    1. 블로그 게시물과 관련된 내용 외에는 답변드리지 않음을 양해 바랍니다.

      참고로 C++은 블로그에 추천해둔 책들을 다 이해한다면 중급개발자 이상이며, 파이썬은 추천할 정도의 책은 저도 아직 경험해본 적이 없습니다.

      감사합니다.

      삭제

댓글 쓰기

이 블로그의 인기 게시물

Qt Designer 설치하기

C++ 예제 (소켓 서버, 이미지, 파일전송)