티스토리 뷰

반응형

백준 15904번 UCPC는 무엇의 약자일까?

 

알고리즘 분류: 그리디 알고리즘, 문자열

 

링크: https://www.acmicpc.net/problem/15904

 

15904번: UCPC는 무엇의 약자일까?

첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공백이 있는 경우는 없고, 공백이 연속해서 2번 이상 주어지는

www.acmicpc.net

 

 

문제

 

UCPC는 '전국 대학생 프로그래밍 대회 동아리 연합 여름 대회'의 줄임말로 알려져있다. 하지만 이 줄임말이 정확히 어떻게 구성되었는지는 아무도 모른다. UCPC 2018을 준비하던 ntopia는 여러 사람들에게 UCPC가 정확히 무엇의 줄임말인지 물어보았지만, 아무도 정확한 답을 제시해주지 못했다. ntopia가 들은 몇 가지 답을 아래에 적어보았다.

  • Union of Computer Programming Contest club contest
  • Union of Computer Programming contest Club contest
  • Union of Computer Programming contest club Contest
  • Union of Collegiate Programming Contest club contest
  • Union of Collegiate Programming contest Club contest
  • Union of Collegiate Programming contest club Contest
  • University Computer Programming Contest
  • University Computer Programming Club contest
  • University Computer Programming club Contest
  • University Collegiate Programming Contest
  • University CPC
  • ...

ntopia는 이렇게 다양한 답을 듣고는 UCPC가 무엇의 약자인지는 아무도 모른다고 결론내렸다. 적당히 슥삭해서 UCPC를 남길 수 있으면 모두 UCPC의 약자인 것이다!

문자열이 주어지면 이 문자열을 적절히 축약해서 "UCPC"로 만들 수 있는지 확인하는 프로그램을 만들어보자.

축약이라는 것은 문자열에서 임의의 문자들을 제거하는 행동을 뜻한다. 예를 들면, "apple"에서 a와 e를 지워 "ppl"로 만들 수 있고, "University Computer Programming Contest"에서 공백과 소문자를 모두 지워 "UCPC"로 만들 수 있다.

문자열을 비교할 때는 대소문자를 구분해 정확히 비교한다. 예를 들어 "UCPC"와 "UCpC"는 다른 문자열이다. 따라서 "University Computer programming Contest"를 "UCPC"로 축약할 수 있는 방법은 없다.

그나저나 UCPC는 정말 무엇의 약자였을까? 정확히 아시는 분은 제보 부탁드립니다.

 

입력

첫 번째 줄에 알파벳 대소문자, 공백으로 구성된 문자열이 주어진다. 문자열의 길이는 최대 1,000자이다. 문자열의 맨 앞과 맨 끝에 공백이 있는 경우는 없고, 공백이 연속해서 2번 이상 주어지는 경우도 없다.

 

출력

첫 번째 줄에 입력으로 주어진 문자열을 적절히 축약해 "UCPC"로 만들 수 있으면 "I love UCPC"를 출력하고, 만들 수 없으면 "I hate UCPC"를 출력한다.

 

 

 

문제 파악

 

이 문제는 입력으로 주어진 문자열을 줄여서 UCPC를 만드는 문제이다.

 

또한 대소문자를 구분하기 때문에 이에 주의해야한다.

 

처음에 이 문제를 풀 때 실수했던 부분은 문자열 슬라이싱을 사용하지 않고 if _ in _ 문을 사용해서 풀었는데

 

예를들어 University Computer Programming 라는 입력값을 넣으면 I hate UCPC가 출력되야한다.

 

문자열 슬라이싱을 사용하지 않고 if _ in _ 문을 사용하니 U, C, P가 다 있으니 I love UCPC가 출력되는 오류를 범했었다.

 

조금 과장하자면 PUC 라는 문자열이 입력되어도 I love UCPC가 출력되는 것이다.

 

그래서 U, C, P, C 가 하나씩 나올때마다 문자열을 슬라이싱해서 찾는 코드를 짜보았다.

 

 

코드

 

 

입력으로 주어지는 문자열을 sentence라는 변수에 저장하였다.

 

U, C, P, C 가 모두 있는지 확인할 수 있는 list를 check_list라는 변수명으로 저장하였다.

 

UCPC로 줄일수 있는지 나타내기 위해 불린 값을 저장하기 위한 check라는 변수를 만들었다.

 

for 문은 check_list의 인덱스들이 sentence에 있는지 확인하기 위해 돌아가고

 

check_list의 인덱스가 sentence에 존재하면 check는 True를 저장해주고

 

앞서 말했듯이 같은 위치의 문자를 보고 컴퓨터가 착각하지 않도록 문자열을 슬라이싱 해준다.

 

sentence.find() 를 사용해서 check_list의 인덱스가 sentence 어느 인덱스에 위치하는지 찾아내어

 

idx라는 변수에 저장해주고 sentence를 idx부분이 포함되지 않게 슬라이싱 한다.

 

만약 check_list의 인덱스가 sentence에 존재하지 않다면 check에 False를 저장해주고

 

break를 통해 반복문을 빠져나오게했다.

 

그렇게 해서 for 문이 종료되고 나서 check 가 True일때 또는 False일때를 나누어서

 

"I love UCPC" 또는 "I hate UCPC"를 출력해주면 된다.

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함