Google 코드잼 및 알고리즘 연습 겸 코드작성 연습 겸!겸!겸!
https://code.google.com/codejam/
군대 안에서 점점 머리가 굳어가는 걸 깨닫고...
'''-이 글의 프로그래밍 언어는 Python으로 작성되었습니다.-'''
이 글을 쓰는 곳은 영내 자대이므로, 추후 시간을 들여서~~~휴가를 나와서~~~ 정리하겠습니다.
자세한 풀이 방법 및 발상 등을 적을 생각입니다.
문제 : https://code.google.com/codejam/contest/189252/dashboard
* 2시간 30분에 A B 다 풀고 C-Small 풀었다. '''65/100'''
C-Large 빼고 Incorrect! 본 적 없다.
물론, Practice Mode라서 실제하고 틀릴 것 같다.
1. BackTracking 참으로 오랜만에 써 봤다. 근데 O(N^N)...
2. C번 코드를 2개 짰다...(DC, DP) 2번째 꺼 짜고 돌렸는데 Incorrect! 보고 절망..
3. O(N^N) 코드는 다음부터 짜면 안되겠다. (100^100)
C-Large 를 넣었는데, '''해방자 100명!''' 터짐..
4. 파이썬으로 알고리즘 처음 짜는데, 확실히 C++보다 편하다.
그럼에도 불구하고 C++을 많이 쓰는 건.. 상대적으로 2% 부족한 속도 때문인가??
==== Problem A. All Your Base ====
for loop in xrange(int(raw_input())):
result=dic.get(S)+result*count
print('Case #{0}: {1}'.format(loop+1,result))
Switch가 없어서 if가 많이 들어갔는데,
지금 생각해 보니, dictionary로 엄청 줄일 수 있을 것 같다.
==== Problem B. Center of Mass ====
for loop in xrange(int(raw_input())):
flycount = int(raw_input())
for loop2 in xrange(flycount):
flyinfo.append(raw_input().split())
c=[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
tmin = -((x*vx+y*vy+z*vz)/(vx*vx+vy*vy+vz*vz))
if tmin < 0 or tmin == -0 :
dmin = math.sqrt(math.pow(x+vx*tmin,2)+math.pow(y+vy*tmin,2)+math.pow(z+vz*tmin,2))
print('Case #'+str(loop+1)+': %(dm).8f %(tm).8f'%{"dm":dmin, "tm":tmin})
map(float,raw_input().split())를 잊어먹고 안 썼다. 그래서 Input 후 자료처리 부분이 지저분하다.
3D 좌표가 나오고, '''Ouput을 float로 요구'''하는 하는 바람에,
반복문 돌려서 풀었다간 틀릴 것이다!라고 생각해서 결국 수학을 했다. 구의 방정식, 어쩌구저쩌구...
math에 pow하고 sqrt는 있겠지 하면서 임포트. 있어서 겨우 풀었다. ~~~help(math)~~~
==== Problem C. Bribe the Prisoners ====
===== Divide&Conquer! =====
def iinput(): return int(raw_input())
def inputline(typ): return map(typ, raw_input().split())
def track(start, end, po):
for N in xrange(len(po)):
P1 = track(start,po[N]-1,po[:N])
P2 = track(po[N]+1,end,po[N+1:])
return linesize[start,end]-1+min(cost)
for loopC in xrange(iinput()):
linesize[(x+1, y-1)] = y-x-1
result = track(1,P,points)
print('Case #{0}: {1}'.format(loopC+1,result))
확실히 코드 작성은 평이하지만, 시간 복잡도가 '''O(N^N)'''
이 말도 안되는 코드가 통과할 수 있었던 것은, N<=5 였기 때문이다. ~~~max(O(N^N))<=3125~~~
하지만 C-Large에 넣었더니 터졌다! 망...
===== Small만 통과한 코드(..?) =====
def iinput(): return map(int,raw_input().split())
for loopC in xrange(int(raw_input())):
for y in xrange(x+1,Q+2):
if (Fr[x],Fr[y]) not in Size:
Size[(Fr[x]+1,Fr[y]-1)]=100000000000000000
Size[(Fr[x]+1,Fr[x+1]-1)]=0
for Diff in xrange(2,Q+2): #간격크기!
# print("Diff : {0}".format(Diff))
for Seq in xrange(Q): #Seq번째 구간!
# print(" <<{0}~{1}>>".format(Fr[Seq]+1,Fr[Seq+Diff]-1))
tempsize += Size[(Fr[Seq]+1,Fr[Seq+n]-1)]
tempsize += Size[(Fr[Seq+n]+1,Fr[Seq+Diff]-1)]
tempsize += Fr[Seq+Diff]-Fr[Seq]-2
# print(" N:{4} <{0}~{1}> + <{2}~{3}>".format(Fr[Seq]+1,Fr[Seq+n]-1,Fr[Seq+n]+1,Fr[Seq+Diff]-1,n))
# print(" Tempsize : {0}, {1}+{2}+{3}".format(tempsize, Size[(Fr[Seq]+1,Fr[Seq+n]-1)], Size[(Fr[Seq+n]+1,Fr[Seq+Diff]-1)],Fr[Seq+Diff]-Fr[Seq]-2))
if tempsize < Size[(Fr[Seq]+1,Fr[Seq+Diff]-1)]:
Size[(Fr[Seq]+1,Fr[Seq+Diff]-1)] = tempsize
print('Case #{0}: {1}'.format(loopC+1,Size[(1,P)]))
'''Size[(Fr[x]+1,Fr[y]-1)]=100000000000000000'''~~~Infinity Integer~~~ '''이런거 넣으시면 안됩니다.'''
~~~버그 잡으려고 print 막 넣은 거 봐.. 결국 잡음. 100000000000000000+4~~~
기준점을 일정한 숫자로 잡아버리는 바람에 망한 코드. 성공한 코드는 뒤쪽 참조.
def iinput(): return map(int,raw_input().split())
for loopC in xrange(int(raw_input())):
Fr = iinput()
= 개요 =
Size = {}
군대 안에서 점점 머리가 굳어가는 걸 깨닫고 머리라도 굴리자는 의미에서 혼자서 달리자!
Fr.sort()
'''그리고 지금''', 퇴화한 머리 이끌고 '''다시 갑니다.'''
Size[(Fr[x]+1,Fr[x+1]-1)]=0
코드잼에서 지금껏 나온 문제를 다 풀고 해석하는 것을 목표로 하고 있습니다.
예전 코드는.. 지웠어요. ~~(볼 게 없어요) (진짜)~~
for Diff in xrange(2,Q+2): #간격크기!
for Seq in xrange(Q): #Seq번째 구간!
tempsize += Size[(Fr[Seq]+1,Fr[Seq+n]-1)]
tempsize += Size[(Fr[Seq+n]+1,Fr[Seq+Diff]-1)]
tempsize += Fr[Seq+Diff]-Fr[Seq]-2
언어는 제가 할 수 있는 모든 언어로 해볼꺼에요. 코드 작성 및 구현 연습도 포함되어 있어서!
if (Fr[Seq]+1,Fr[Seq+Diff]-1) not in Size:
Size[(Fr[Seq]+1,Fr[Seq+Diff]-1)] = tempsize
elif tempsize < Size[(Fr[Seq]+1,Fr[Seq+Diff]-1)]:
Size[(Fr[Seq]+1,Fr[Seq+Diff]-1)] = tempsize
pass
[[TableOfContents]]
print('Case #{0}: {1}'.format(loopC+1,Size[(1,P)]))
시간이 정말 많이 걸리기는 한다. 그래도 O(N^3)까지 줄였다. '''O(N^3)<=1000000'''
Dynamic Programming으로 작성. 확실히 머리가 아프다.
하지만 시간복잡도를 줄일 수 있다면! 그것 만으로도 감사하다.
= 문제 풀이 자취 =
준비!