Skip to content

parent link: Hash

SW Expert Academy#

Excerpt#

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!


※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

**** 

제한 조건

실행시간 : 최대 10개의 테스트 케이스를 합쳐서 C++ 의 경우 1 / Java 의 경우 2

메 모 리 : Heap, Global, Stack 등을 모두 합해 최대 256MB까지 사용 가능

(단, 스택은 최대 1MB까지 사용 가능)

제출 횟수 제한

99

채점

답안을 제출하면 제공된 sample_input.txt 에 대한 결과를 판정해서 실시간으로 알려주며

그 의미는 다음과 같다.

Accept : sample input에 대하여 정답 또는 부분 점수 획득

Fail : sample input에 대하여 오답 또는 런타임 에러, time out 등

(※ sample_input.txt 파일 다운로드는 문제 지문 바로 아래에 있습니다)

최종결과는 별도의 채점용 input으로 진행되므로 시험 중 판정 결과와 다를 수 있다.

평가

최종 점수는 별도로 제작된 평가용 테스트 케이스로 측정하며,

동점자간에는 실행시간에 따라 점수 차이가 발생할 수 있습니다.

따라서 시험이 끝날 때까지 본인의 코드를 최적화 하시기를 권장합니다.

[문제 설명]

메일을 주고받는 기능을 제공하는 메일서버 프로그램을 작성하려고 한다.

메일서버 프로그램에는 메일 전송, 받은 메일 삭제, 받은 메일 검색 등의 기능이 있다. 

메일서버에는 각각의 유저에게 받은 메일을 저장할 수 있는 받은 메일함이 주어진다.

받은 메일함은 일정한 개수의 메일만 저장된다.

아래 API 설명을 참조하여 각 함수를 구현하라.

※ 아래 함수 signature는 C/C++에 대한 것으로 Java에 대해서는 제공되는 Solution.java와 UserSolution.java를 참고하라. 

아래는 User Code 부분에 작성해야 하는 API 의 설명이다.

void init(int N, int K)

각 테스트 케이스의 처음에 호출된다.

N 명의 유저가 메일서버를 이용한다.

유저 한 명당 받은 메일함에 저장할 수 있는 메일의 개수는 K 개이다.

각각의 인자 값의 범위는 아래와 같다.

  N ≤ 1,000

  K ≤ 300

Parameters

   N : 메일 서버 이용자의 수

   K : 받은 메일함에 저장할 수 있는 메일의 개수

void sendMail(char subject[], int uID, int cnt, int rIDs[])

uID 유저가 subject[] 제목의 메일 전송을 메일 서버에 요청한다.

메일 서버는 subject[] 제목의 메일을 rIDs[] 수신인들의 받은 메일함에 저장한다.

수신인들의 받은 메일함에 있는 메일의 개수가 K 개일 경우, 가장 오래된 메일이 삭제되고 subject[] 제목의 메일이 저장된다.

subject[] 는 1개 이상 10개 이하의 단어로 구성되며, 단어가 2개 이상일 경우 각 단어의 사이는 빈 칸(‘ ‘) 하나로 이루어져 있다.

subject[] 에 포함되는 각 단어는 영어 소문자로 구성되며, 길이는 3 이상 10 이하이다.

subject[] 는 ‘\0’ 으로 끝나는 문자열이다.

rIDs[] 는 모두 서로 다른 사용자의 id 이다.

각각의 인자 값의 범위는 아래와 같다.

  subject[] 에 있는 단어의 개수 ≤ 10

 0 ≤ uID ≤ ( N - 1 )

 1 ≤ cnt ≤ 50

 0 ≤ rIDs[] ≤ ( N - 1 )

Parameters

   subject[] : 메일 제목

   uID : 메일을 보내는 유저의 id

   cnt : 메일을 받는 사람들의 수

   rIDs[] : 메일을 받는 유저들의 id

int getCount(int uID)

uID 유저의 받은 메일함에 있는 메일의 수를 반환한다.

반환되는 메일의 개수에 삭제된 메일은 포함되지 않는다.

각각의 인자 값의 범위는 아래와 같다.

 0 ≤ uID ≤ ( N - 1 )

Parameters

   uID : 받은 메일함을 확인하는 유저의 id

Returns

   uID 유저의 받은 메일함에 있는 메일 개수

int deleteMail(int uID, char subject[])

uID 유저의 받은 메일함에서 subject[] 와 일치하는 제목을 가진 메일을 삭제하고, 삭제한 메일의 개수를 리턴한다.

subject[] 는 영어 소문자와 빈칸으로 구성되며, ‘\0’ 으로 끝나고 ‘\0’ 을 포함한 전체 길이는 200 이하이다.

각각의 인자 값의 범위는 아래와 같다.

 0 ≤ uID ≤ ( N - 1 )

Parameters

   uID : 메일을 삭제하려는 유저의 id

   subject[] : 삭제할 메일의 제목

Returns

   삭제한 메일의 개수

int searchMail(int uID, char text[])

uID 유저의 받은 메일함에서 메일 제목에 text[] 단어가 포함되어 있는 메일을 찾고, 찾은 메일의 개수를 리턴한다.

메일 제목에 포함되어 있는 단어 중 하나와 text[] 단어가 일치해야만 검색이 되며, 일부분만 같을 경우 검색이 되지 않아 찾은 메일 개수에 포함되지 않는다.

예를 들어, 메일 제목이 “aaaa bbbb cccc” 이고, text[] = “aaa” 일 경우 해당 메일은 찾은 메일 개수에 포함되지 않는다.

text[] 는 영어 소문자로 구성되며, \0’ 으로 끝나고 ‘\0’ 을 포함한 전체 길이는 11 이하이다.

각각의 인자 값의 범위는 아래와 같다.

 0 ≤ uID ≤ ( N - 1 )

Parameters

   uID : 받은 메일함에서 단어를 검색하려는 유저의 id

   text[] : 검색할 단어

Returns

   검색된 메일의 개수

[예제]

아래 [Table 1] 같이 함수가 호출되는 경우를 살펴보자.

Order

Function

Note

Figure

1

init(10, 3)

2

sendMail(“test email abcd”, 0, 3, {0, 1, 2})

3

sendMail(“test email abcd”, 0, 2, {2, 3})

4

sendMail(“test key test aaa”, 1, 2, {0, 2})

5

getCount(2)

return 3

[Fig. 1]

6

searchMail(2, “test”)

return 3

7

deleteMail(2, “test email abcd”)

return 2

[Fig. 2]

8

sendMail(“key subject”, 3, 2, {0, 1})

9

searchMail(0, “abcd”)

return 1

[Fig. 3]

10

sendMail(“subject email”, 2, 2, {0, 3})

11

searchMail(0, “sub”)

return 0

[Fig. 4]

12

deleteMail(2, “dummy age”)

return 0

13

searchMail(0, “goto”)

return 0

[Table 1]

순서 5 의 getCount(2) 함수 호출 시, 받은 메일함은 [Fig. 1] 과 같고 리턴 값은 3 이 된다.

순서 7 의 deleteMail(2, “test email abcd”) 함수 호출 시, 유저 id = 2 의 받은 메일함에서 2개의 메일이 삭제되어 [Fig. 2] 와 같이 된다.

순서 9 의 searchMail(0, “abcd”) 함수 호출 시, 받은 메일함은 [Fig. 3] 과 같고 리턴 값은 1 이 된다.

순서 11 의 searchMail(0, “sub”) 함수 호출 시, 받은 메일함은 [Fig. 4] 과 같고 리턴 값은 0 이 된다.

[제약사항]

1. 각 테스트 케이스 시작 시 init() 함수가 호출된다.

2. sendMail() 함수에서 수신인들의 받은 메일함에 있는 메일의 개수가 K 개일 경우, 가장 오래된 메일이 삭제되고 subject[] 제목의 메일이 저장된다.

3. 각 테스트 케이스에서 메일서버를 이용하는 유저의 수는 최대 1,000 이다.

4. 각 테스트 케이스에서 사용되는 서로 다른 단어의 종류는 최대 10,000 개이다.

5. 각 테스트 케이스에서 sendMail() 함수의 호출 횟수는 최대 10,000 이다.

6. 각 테스트 케이스에서 모든 함수의 호출 횟수 총합은 최대 30,000 이다.

[입출력]

입출력은 제공되는 Main 부분의 코드에서 처리하므로 User Code 부분의 코드에서는 별도로 입출력을 처리하지 않는다.

Sample input 에 대한 정답 출력 결과는 아래와 같은 형태로 보여진다.
100
100
100
100
100