Python/2.7 simple coding(+ c++)

Net-Force Programming 4~5,6?

qkqhxla1 2014. 12. 3. 17:22

4. app.txt에서 8방향으로 123이 나타나는지 검사해서 나타난 갯수를 구하는 문제이다.


이거 뭔가 알고리즘이 있을텐데 내 낮은 프로그래밍 실력으로는 일일히 검사하는방법밖에 모르겠다.


으아아아ㅏ아아 더러워 이거 좋은 알고리즘 아시는분 좀 알려주세요...


import urllib2

req = urllib2.Request('http://www.net-force.nl/challenge/level604/aap.txt')
req.add_header('cookie','PHPSESSID=1ltc3b2dod3nc2ft8jbc47irt0')
num = urllib2.urlopen(req).read()

num = num.split('\n')

cnt = 0
for i in range(0,len(num)):
    for j in range(0,len(num[i])):
        if num[i][j]=='1':
            try:
                if num[i][j+1]=='2' and num[i][j+2]=='3':
                    cnt += 1
            except:
                pass
            try:
                if num[i+1][j]=='2' and num[i+2][j]=='3':
                    cnt += 1
            except:
                pass
            try:
                if num[i+1][j+1]=='2' and num[i+2][j+2]=='3':
                    cnt += 1
            except:
                pass
            try:
                if num[i][j-1]=='2' and num[i][j-2]=='3' and j-2>=0:
                    cnt += 1
            except:
                pass
            try:
                if num[i-1][j]=='2' and num[i-2][j]=='3' and i-2>=0:
                    cnt += 1
            except:
                pass
            try:
                if num[i-1][j-1]=='2' and num[i-2][j-2]=='3' and i-2>=0 and j-2>=0:
                    cnt += 1
            except:
                pass
            try:
                if num[i-1][j+1]=='2' and num[i-2][j+2]=='3' and i-2>=0:
                    cnt += 1
            except:
                pass
            try:
                if num[i+1][j-1]=='2' and num[i+2][j-2]=='3' and j-2>=0:
                    cnt += 1
            except:
                pass
print cnt


5. 유명한 n-queen문제이다. n이 4~10일때 가능한 경우의 수를 모두 더하면 답이다. 위키에


유용한 소스가 있어서 알고리즘을 베껴 왔다...


def path(y):
    global cnt,board
    ko = 1
    if y==n:
        cnt += 1
        return
    for i in range(0,n): 
        ko = 1
        for j in range(0,y): 
            if board[j]==i or abs(y-j)==abs(i-board[j]):
                ko = 0
                break
        if ko:
            board[y] = i
            path(y+1)

cnt = 0
for n in range(4,11):
    board = [0 for i in range(n)]
    path(0)
print cnt


6. 컵에 들어갈 수 있는 경우의 수를 구하는 건데..... 재귀함수로 짜서 되긴 되는데


숫자가 10 이상이 되니까 재귀함수 특유의 딜레이가 심해진다.... 500까지 돌리려면 몇일 돌려놔야


할것 같아서 재귀함수가 아니라 어떤 수열로 짜야되는것 같은데 아무리 봐도봐도 수열이 보이지 


않는다... 그냥 포기하고 재귀함수 코드만 올림...


def count(n,cnt):
    global cup,answer
    ball = 5
    cnt += 1
    if cnt-1==cup:
        if n==ball:
            answer += 1
    else:
        for i in range(0,ball+1):
            count(n+i,cnt)

sum = 0
for cup in range(0,7):
    cnt = 0
    answer = 0
    count(0,cnt)
    sum += answer
print sum


'Python > 2.7 simple coding(+ c++)' 카테고리의 다른 글

Security Override Programming 4~5  (0) 2014.12.17
Security Override Programming 1~3  (0) 2014.12.17
Net-Force Programming 1~3  (0) 2014.12.01
webhacking.kr 31  (0) 2014.11.30
Enigmagroup missions/programming 9  (0) 2014.11.27