[Google Codejam] Qualification Round 2014-Magic Trick
문제 link : https://code.google.com/codejam/contest/dashboard?c=2974486
Google Codejam 이 시작되었다. 참가는 하지 않았지만, 하나씩 풀어 보려고 노력중이다.
이 문제는 처음 시작하는 사람들에게 자신감을 줄 수 있는 문제가 아닌가 한다. :-)
문제의 내용을 요약하면,
마술사가 1~16까지의 수가 적힌 카드를 갖고 4X4 로 무작위(사실 마술사가 트릭을 쓴다는 내용이다. 실제 무작위가 아님)로 배열한뒤 지원자가 선택한 카드가 무엇인지 맞추는 문제이다.
Rule 과 함께 예제를 들면,
1. 마술사가 1~16 까지 숫자를 4X4로 놓는다.
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2. 지원자가 원하는 숫자가 어느 열에 있는지 물어본다.
예를 들어 지원자는 7을 생각했고 마술사에게 "2"열이라고 답해준다.
3. 마술사가 카드를 썪어 다시 한번 놓게된다.
1 2 5 4
3 11 6 15
9 10 7 12
13 14 8 16
4. 그럼 지원자는 "3" 열이라고 마술사에게 얘길 하고, 마술사는 지원자가 생각한 숫자 7을 말해주면 된다.
이는 마술사가 1번째와 2번째 카드 배열시 "Trick"을 써 지원자의 생각한 숫자를 맞추는 것이다.
(이런걸 속을 수 있나.. 지원자도 말하면서 눈치를 챌듯..)
이렇게 정상적인 case 만 있는 것은 아니다. 지원자가 실제 위의 예제에서 마술사가 2번째로 카드를 배열했을 때
3열이라고 답해야 하지만, 2열이라고 답하게 되었다면 "Volunteer cheated!" 출력하고,
마술사가 2번째 배열에서 5,6,7,8 을 다른 열로 분리를 해야 하는데, 하나이상 같은 열에 놓게 되어 맞출수 없는 경우에는
"Bad magician!" 이라고 출력하면 이 문제는 완전히 풀수 있게 된다.
문제 link 를 가면, Sample case 가 잘 나와있다.
일단 Google Codejam 은 input data file을 제공한다. 이 파일을 받아서 code의 input으로 사용하면된다.
input 파일의 한라인씩 읽는다고 했을때,
첫번째 배열에서 지원자가 말한 열(5, 6, 7, 8) 을 저장해놓고 다음 배열에서 말한 (9, 10, 7, 12)를 단순 비교한다
만약
1. 같은 숫자가 하나 라면, 그 값을 return 한다.
2. 같은 숫자가 2 이상 4 이하라면 "Bad magician!" 을 return 한다.
3. 같은 숫자가 하나도 없으면 "Volunteer cheated!" 를 return 한다.
끝.
파일을 첨부하는데 문제가 있어, code를 붙여 넣는다.
def checkCards(first, second): sameCount = 0 sameNum = "" for num in range(0, len(first)): for snum in range(0, len(second)): if first[num] == second[snum]: sameCount = sameCount + 1 sameNum = first[num] if sameCount == 1: return sameNum elif sameCount > 1 and sameCount <= 4: return "Bad magician!" elif sameCount == 0: return "Volunteer cheated!" # never reach hear with data from codejam return "error" if __name__ == "__main__": testcases = input() LineOfCardsFirst = [] LineOfCardsSeconds = [] for caseNr in xrange(1, testcases + 1): for num in range(0,2): selectRow = raw_input() #print "selected Row : ", selectRow for row in xrange(0, 4): if row == int(selectRow) - 1: if (num == 0): LineOfCardsFirst = map(int, raw_input().split()) #print "LineOfCards : ", LineOfCardsFirst else: LineOfCardsSeconds = map(int, raw_input().split()) #print "LineOfCards : ", LineOfCardsSeconds else: raw_input()
print("Case #%i: %s" % (caseNr, checkCards(LineOfCardsFirst, LineOfCardsSeconds)))
'Algorithm' 카테고리의 다른 글
[GitHub] Algorithm 문제 풀기(TopCoder, Hackerrank) (1) | 2015.11.27 |
---|---|
[Google Codejam] Qualification Round 2014-Cookie Clicker Alpha (0) | 2014.05.07 |
[Algorithm] Python 배우기 (0) | 2013.10.09 |
[Alogithm Practice] CodeChef 소개 (0) | 2013.05.15 |