https://www.codingame.com/training/easy/lumen

 

Practice Loops and 2D array with the exercise "Lumen"

Want to practice Loops and 2D array? Try to solve the coding challenge "Lumen".

www.codingame.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import sys
import math
 
= int(input())
= int(input())
line = [[''for i in range(n)]for j in range(n)]
for i in range(n):
    line[i] = input().split()
 
for i in range(n):
    for j in range(n):
        if line[i][j]=='C':
            for x in range(-(l-1), l):
                for y in range(-(l-1), l):
                    if i+x<0 or i+x>=or j+y<0 or j+y>=or line[i+x][j+y]=='C':
                        continue
                    line[i+x][j+y] = 'O'
 
count=0
for i in range(n):
    for j in range(n):
        if line[i][j]=='X':
            count = count+1
print(count)
cs

'python > codinGame' 카테고리의 다른 글

GRAFFITI ON THE FENCE  (0) 2020.03.06
Rectangle Partition  (0) 2020.03.06
Defibrillators  (0) 2020.03.03
ANEO Sponsored Puzzle  (0) 2020.03.03

https://www.codingame.com/training/easy/graffiti-on-the-fence

 

Practice Array forbidden with the exercise "Graffiti on the fence"

Want to practice coding? Try to solve this easy puzzle "Graffiti on the fence" (25+ languages supported).

www.codingame.com

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
32
33
34
35
36
37
import sys
import math
 
# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.
 
= int(input())
= int(input())
 
fill = [[0 for i in range(2)]for j in range(n)]
 
for i in range(n):
    fill[i][0], fill[i][1= [int(j) for j in input().split()]
        
fill.sort()     # st점을 기준으로 오름차순 정렬된다.
 
# 칠해지지않은 구간 시작지점, 끝지점 초기화.
start = 0
end = start+1
# 칠해지지 않은 구간을 찾아서 프린트한다.
for f in range(n+1):
    if f==n:                        # 주어진 칠해진 구간 모두 탐색 후 담벼락의 끝까지 탐색.
        if start!=l:                # 마지막 칠해진 구간 ~ 담벼락 끝까지 빈 벽이 있음.
            print(start, end=" ")
            print(l)
        if start==and end==1:     # end==1은 초기 end 값에서 한번도 갱신된 적 없음을 뜻한다.
            print("All painted")
    # f번째 칠해진 구간 직전에 칠해지지 않은 구간이 존재함.
    elif fill[f][0]>start:
        print(start, end=" ")
        end = fill[f][0]
        print(end)
        start = fill[f][1]  # f번째 칠해진 구간 끝점에서 칠해지지않은 구간 재탐색.
    # f번째 칠해진 구간 내부에 현재 칠해지지않은 구간 위치가 포함됨.
    elif fill[f][0]<=start:
        # 현재 칠해지지 않은 구간 위치와 f번째 칠해진 구간 끝 지점 중 더 큰 것을 선택.
        start = max(start, fill[f][1])
cs

'python > codinGame' 카테고리의 다른 글

LUMEN  (0) 2020.03.06
Rectangle Partition  (0) 2020.03.06
Defibrillators  (0) 2020.03.03
ANEO Sponsored Puzzle  (0) 2020.03.03

https://www.codingame.com/training/easy/rectangle-partition

 

Practice Loops and Arrays with the exercise "Rectangle Partition"

Want to practice Loops and arrays? Try to solve the coding challenge "Rectangle Partition".

www.codingame.com

import sys
import math

w, h, count_x, count_y = [int(i) for i in input().split()]
x = ['']*(count_x)
y = ['']*(count_y)

# x축, y축을 나누는 숫자 입력
tmp = 0
for i in input().split():
    x[tmp] = int(i)
    tmp +=1
tmp = 0
for i in input().split():
    y[tmp] = int(i)
    tmp = tmp+1
    
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
x = list(set(x))
x.sort()
y = list(set(y))
y.sort()

count =0        # 정사각형의 개수 0으로 초기화.

# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)

dpx = [int(0)]*(w+1)
dpy = [int(0)]*(h+1)

for x_s in range(lx):
    for x_inc in range(x_s, lx+1):
        if x_inc==x_s:    # 건너뛰는 간격이 0이면 본인.
            dpx[ x[x_s] ] +=1
        elif x_inc==lx:
            dpx[ w-x[x_s] ] +=1  # 제일 끝으로 가면 전체 길이에서 본인 뺀다.
        else:           # 건너뛰는 간격 크기만큼 간 후 본인과 뺀다.
            dpx[x[x_inc]-x[x_s]] +=1
dpx[w] = 1

for y_s in range(ly):  
    for y_inc in range(y_s, ly+1):
        if y_inc==y_s:
            dpy[ y[y_s] ] +=1
        elif y_inc==ly:
            dpy[ h-y[y_s] ] +=1
        else:
            dpy[ y[y_inc]-y[y_s] ] +=1
dpy[h] = 1 

#print(dpx)
#print(dpy)

for i in range(w+1):
    for j in range(h+1):
        if dpx[i]==0 or dpy[j]==0:
            continue
        if i==j:
            #print(i, j, dpx[i], dpx[j], dpx[i]*dpy[j])
            count += dpx[i]*dpy[j]
            
print(count)
import sys
import math

w, h, count_x, count_y = [int(i) for i in input().split()]
x = ['']*(count_x)
y = ['']*(count_y)

# x축, y축을 나누는 숫자 입력
tmp = 0
for i in input().split():
    x[tmp] = int(i)
    tmp +=1
tmp = 0
for i in input().split():
    y[tmp] = int(i)
    tmp = tmp+1
    
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
x = list(set(x))
x.sort()
y = list(set(y))
y.sort()

count =0        # 정사각형의 개수 0으로 초기화.

x_diff=0
y_diff=0

# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)

for x_s in range(lx+1):
    for y_s in range(ly+1):
        for x_inc in range(lx-x_s+1):
            if x_inc==0 and x_s!=lx:    # 건너뛰는 간격이 0이면 본인.
                x_diff = x[x_s]
            elif x_inc==lx-x_s and x_s==lx:
                x_diff = w
            elif x_inc==lx-x_s:
                x_diff = w-x[x_s]   # 제일 끝으로 가면 전체 길이에서 본인 뺀다.
            else:           # 건너뛰는 간격 크기만큼 간 후 본인과 뺀다.
                x_diff = x[x_s+x_inc]-x[x_s]
                
            for y_inc in range(ly-y_s+1):
                if y_inc==0 and y_s!=ly:
                    y_diff = y[y_s]
                elif y_inc==ly-y_s and y_s==ly:
                    y_diff = h
                elif y_inc==ly-y_s:
                    y_diff = h-y[y_s]
                else:
                    y_diff = y[y_s+y_inc]-y[y_s]
                #print("x_s: "+str(x_s)+" x_inc: "+str(x_inc)+" y_s: "+ str(y_s)+" y_inc: "+str(y_inc))
                #print(str(x_diff)+" "+str(y_diff), end="\n")
                # 두 간격이 같고, 0이 아니면 count 추가.    
                if x_diff==y_diff and x_diff!=0:
                    count = count+1

print(count)

첫 번째 코드는 hi-density는 물론, low-density case를 통과하지 못한다.

두 번째 코드는 hi-density만 통과하지 못한다...

이미 계산한 정보는 저장하래서 저장했는데 뭐가 문제일까?

 

import sys
import math

w, h, count_x, count_y = [int(i) for i in input().split()]
x = ['']*(count_x)
y = ['']*(count_y)

# x축, y축을 나누는 숫자 입력
tmp = 0
for i in input().split():
    x[tmp] = int(i)
    tmp +=1
tmp = 0
for i in input().split():
    y[tmp] = int(i)
    tmp = tmp+1
    
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
x = list(set(x))
x.sort()
y = list(set(y))
y.sort()

count =0        # 정사각형의 개수 0으로 초기화.

x_diff=0
y_diff=0

# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)

dpx = []
dpy = []

for x_s in range(lx):
    for x_inc in range(x_s, lx+1):
        if x_inc==x_s:    # 건너뛰는 간격이 0이면 본인.
            dpx.append(x[x_s])
        elif x_inc==lx:
            dpx.append(w-x[x_s])   # 제일 끝으로 가면 전체 길이에서 본인 뺀다.
        else:           # 건너뛰는 간격 크기만큼 간 후 본인과 뺀다.
            dpx.append(x[x_inc]-x[x_s])
dpx.append(w)

for y_s in range(ly):  
    for y_inc in range(y_s, ly+1):
        if y_inc==y_s:
            dpy.append(y[y_s])
        elif y_inc==ly:
            dpy.append(h-y[y_s])
        else:
            dpy.append(y[y_inc]-y[y_s])
dpy.append(h)    

# dpx와 dpy를 정렬한다.
dpx.sort()
dpy.sort()

for i in range(len(dpx)):
    for j in range(len(dpy)):
        if dpx[i]==dpy[j]:
            count = count+1
            
print(count)

부분 선분의 길이를 인덱스로 하는 배열에 부분 선분이 몇 개 등장하는지 저장하여 나중에 x기준, y기준으로 같은 길이의 선분이 있으면 배열의 값만 곱해서 더해주면 되는 코드이다.

이 코드는 hi-density만 통과하지 못한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import sys
import math
 
w, h, count_x, count_y = [int(i) for i in input().split()]
= []
= []
 
# x축, y축을 나누는 숫자 입력
for i in input().split():
    x.append(int(i))
for i in input().split():
    y.append(int(i))
 
# x와 y의 부분 선분 리스트에 시작점 0과 끝점 w/h를 추가한다.
x.append(0)
x.append(w)
y.append(0)
y.append(h)
 
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
= list(set(x))
= list(set(y))
x.sort()
y.sort()
 
count =0        # 정사각형의 개수 0으로 초기화.
 
# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)
 
dpx = {}
dpy = {}
 
for x_s in range(lx):
    for x_inc in range(x_s+1, lx):
        xkey = x[x_inc]-x[x_s]
            
        if xkey in dpx:
            dpx[xkey] += 1
        else:
            dpx[xkey] =1
 
 
for y_s in range(ly):  
    for y_inc in range(y_s+1, ly):
        ykey = y[y_inc]-y[y_s]
            
        if ykey in dpy:
            dpy[ykey] += 1
        else:
            dpy[ykey] =1
 
for i in dpx.keys():
    for j in dpy.keys():
        if i==j:
            count += dpx[i]*dpy[j]
print(count)
cs

딕셔너리 자료형을 사용해서, 키로 사용할 부분 선분의 길이가 딕셔너리에 존재하면 value를 1 증가, 아니면 딕셔너리에 추가하는 방식을 사용했더니 hi-density를 하나 통과할 수 있었다.

=>

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import sys
import math
 
w, h, count_x, count_y = [int(i) for i in input().split()]
 
# x축, y축을 나누는 숫자 입력
= [int(i) for i in input().split()]
= [int(i) for i in input().split()]
 
# x와 y의 부분 선분 리스트에 시작점 0과 끝점 w/h를 추가한다.
x.append(0)
x.append(w)
y.append(0)
y.append(h)
 
# x와 y리스트를 각각 set으로 변환 후 list로 재변환해서 중복되는 데이터를 제거한다.
= list(set(x))
= list(set(y))
x.sort()
y.sort()
 
count =0        # 정사각형의 개수 0으로 초기화.
 
# 리스트 x와 y의 길이 미리 계산하여 저장해둔다.
lx = len(x)
ly = len(y)
 
dpx = {}
dpy = {}
 
for x_s in range(lx-1):
    for x_inc in range(x_s+1, lx):
        xkey = x[x_inc]-x[x_s]
            
        if xkey in dpx:
            dpx[xkey] += 1
        else:
            dpx[xkey] =1
 
 
for y_s in range(ly-1):  
    for y_inc in range(y_s+1, ly):
        ykey = y[y_inc]-y[y_s]
            
        if ykey in dpy:
            dpy[ykey] += 1
        else:
            dpy[ykey] =1
 
for i in dpx.keys():
    if i in dpy:
        count+=dpx[i]*dpy[i]
print(count)
cs

직전의 코드와 다른 점은,

dpx에 존재하는 각각의 키 i가 dpy에 존재하는지 여부만 검사하여 dpx[i]*dpy[i]를 수행했다는 점이다.(line 50~52)

모든 케이스를 통과하였다!

'python > codinGame' 카테고리의 다른 글

LUMEN  (0) 2020.03.06
GRAFFITI ON THE FENCE  (0) 2020.03.06
Defibrillators  (0) 2020.03.03
ANEO Sponsored Puzzle  (0) 2020.03.03

https://www.codingame.com/training/easy/defibrillators

 

Practice Loops and Distances with the exercise "Defibrillators"

Want to practice Loops and distances? Try to solve the coding challenge "Defibrillators".

www.codingame.com

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
32
33
34
import sys
import math
 
# Auto-generated code below aims at helping you parse
# the standard input according to the problem statement.
 
lon = input().split(',')
lon = lon[0]+"."+lon[1]
lat = input().split(',')
lat = lat[0]+"."+lat[1]
= int(input())
defib = ['']*n
for i in range(n):
    defib[i] = input().split(';')
    defib[i][4= defib[i][4].split(',')
    defib[i][4= defib[i][4][0]+"."+defib[i][4][1]
    defib[i][5= defib[i][5].split(',')
    defib[i][5= defib[i][5][0]+"."+defib[i][5][1]
    
 
minD = float(1000000000000000000000# 최소거리.
minI = 0        # 최소거리를 가지는 defib의 인덱스.
 
for i in range(n):
    x = (math.radians(float(defib[i][4]))-math.radians(float(lon)))*
math.cos((math.radians(float(lat))+math.radians(float(defib[i][5])))/2)
    y = (math.radians(float(defib[i][5]))-math.radians(float(lat)))
    d = math.sqrt(x**2 + y**2)*6371
    if float(minD) > d:
        minD = d
        minI = i
# Write an action using print
# To debug: print("Debug messages...", file=sys.stderr)
 
print(defib[minI][1])
cs

lat = input() 형식으로 입력받으면 43,50982가 스트링 형식으로 입력된다.
43.50982의 실수 형태로 변환해가며 입력받기 위해서는
lat = float(input().replace(",", "."))으로 입력받아야한다.
위의 문제에서 사용하기 위해서는 라디안으로 변환해야하므로
lat = math.radians(lat)으로 변환해준다.

내가 사용했던

lat = input().split(",")
lat = lat[0]+"."+lat[1]
lat = float(lat)

위의 코드에 비하면 아주 간단하게 변환할 수 있다!

 

+) 파이썬에서 cos 함수와 sqrt함수는 math.cos(), math.sqrt()로 사용한다.

'python > codinGame' 카테고리의 다른 글

LUMEN  (0) 2020.03.06
GRAFFITI ON THE FENCE  (0) 2020.03.06
Rectangle Partition  (0) 2020.03.06
ANEO Sponsored Puzzle  (0) 2020.03.03

https://www.codingame.com/training/medium/aneo

 

Practice Loops and Intervals with the exercise "ANEO Sponsored Puzzle"

Want to practice Loops and intervals? Try to solve the coding challenge "ANEO Sponsored Puzzle".

www.codingame.com

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
32
33
34
35
36
import sys
import math
 
# traffic lights를 통과할 수 있는 최대 속도 구하기.
 
speed = int(input())
 
light_count = int(input())      # 신호등 개수
 
light = ['']*light_count
for i in range(light_count):
    light[i] = ['']*2
   
for i in range(light_count):
    distance, duration = [int(j) for j in input().split()]
    light[i][0= distance
    light[i][1= duration
    
answer = speed
flag = 0
for s in range(speed, 0-1):
    for i in range(light_count):
 
        if (light[i][0]/s*3.6)%(2*light[i][1]) < light[i][1]:
            answer = s
        else:
            s=s-1
            break        # 이 속도로 모든 신호등을 통과할 수 없다면 속도 줄이고 첫 신호등부터 다시.
        
        if i==light_count-1:
            flag = 1    # 모든 신호등을 통과할 수 있는 속도가 찾아졌다!
            
    if flag==1:
        break
    
print(answer)
cs

'python > codinGame' 카테고리의 다른 글

LUMEN  (0) 2020.03.06
GRAFFITI ON THE FENCE  (0) 2020.03.06
Rectangle Partition  (0) 2020.03.06
Defibrillators  (0) 2020.03.03

10.1 리스트 만들기

>>> a = [10, 20, 30, 40, 50]

>>> a

[10, 20, 30, 40, 50]

[] 값을 묶어주면 리스트가 된다. 값은 , 구분해준다.

리스트에 저장된 값은 요소(element)라고 한다.

 

10.1.1 리스트에 여러 가지 자료형 저장하기

하나의 리스트에 여러 가지 자료형을 섞어서 저장해도 된다.

>>> person = ['홍길동', 20, 180, True]

>>> person

['홍길동', 20, 180, True]

객체에 관련된 정보들을 하나로 묶어서 관리하기에 편리하다.

 

10.1.2 리스트 만들기

>>> a = []

>>> a

[]


>>> b = list()

>>> b

[]

리스트를 만들어 놓은 후에 값을 추가하는 방식으로 활용한다.

 

10.1.3 range 사용하여 리스트 만들기

range() 연속된 숫자를 생성하는 함수.

range(10) : 0부터 9까지 숫자를 생성한다.

>>> range(10)

range(0, 10)
# 리스트 = list(range(횟수))

# == list(range(0, 횟수))

>>> a = list(range(10))

>>> a

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 리스트 = list(range(시작, 끝))

>>> b = list(range(3, 7))

>>> b

[3, 4, 5, 6]
# range에 증가폭을 지정하면 해당 값만큼 증가하면서 숫자를 생성.

# 리스트 = list(range(시작, 끝, 증가폭))

>>> c = list(range(-4, 10, 2))

>>> c

[-4, -2, 0, 2, 4, 6, 8]

 

 

10.2 튜플 사용하기

튜플은 리스트처럼 요소를 일렬로 저장하지만, 안에 저장된 요소를 변경, 추가, 삭제할 없다.

-> 읽기 전용 리스트라고 생각하자.

# 튜플 = (값, 값, 값)

# 튜플 = 값, 값, 값

>>> a = (38, 21, 53, 63, 26)

>>> a

(38, 21, 53, 63, 26)


>>> a = 38, 21, 53, 63, 26

>>> a

(38, 21, 53, 63, 26)

 

튜플토 리스트처럼 여러 자료형을 동시에 저장할 있다.

>>> person = ('홍길동', 20, 180, True)

>>> person

('홍길동', 20, 180, True)

 

튜플은 요소가 절대 변경되지 않고 유지되어야 사용한다.

튜플을 만든 상태에서 요소를 변경하면 에러가 발생한다.

 

10.2.1. 요소가 들어있는 튜플 만들기

# 값 한 개를 괄호로 묶으면 튜플이 아니라 그냥 값이 된다.

>>> (38)

38

 

# 요소가 한개인 튜플 만들기

# 튜플 = (값, )

# 튜플 = 값,

>>> (38, )

(38, )

>>> 38,

(38, )

 

한개짜리 튜플이 필요한 이유 : 함수를 사용할 값이 아닌 튜플을 넣어야 하는 경우가 발생하는데, 값은 한개지만 튜플 형식으로 넣어야 (, ) 형태로 넣어준다.

 

10.2.2 range 사용하여 튜플 만들기

# 튜플 = tuple(range(횟수))

>>> a = tuple(range(4))

>>> a

(0, 1, 2, 3)

 

# 튜플 = tuple(range(0, 횟수))

>>> a = tuple(range(0, 4))

>>> a

(0, 1, 2, 3)

 

# 튜플 = tuple(range(시작, 끝, 증가폭))

>>> a = tuple(range(-2, 12, 4))

>>> a

(-2, 2, 6, 10)

 

10.2.3 튜플<->리스트 변경

# 리스트 -> 튜플

>>> a = [1, 2, 3]

>>> tuple(a)

(1, 2, 3)
# 튜플 -> 리스트

>>> a = (1, 2, 3)

>>> list(a)

[1, 2, 3]

 

 

+) list tuple안에 문자열을 넣으면

문자열의 문자 하나하나가 리스트, 튜플의 요소로 생성된다.

>>> a = list('Hello')

>>> a

['H', 'e', 'l', 'l', 'o']
>>> a = tuple('Hello')

>>> a

('H', 'e', 'l', 'l', 'o')

 

+) 리스트와 튜플 사용해서 변수 여러 만들기

>>> a, b, c = [10, 20, 40]

>>> print(a, b, c)

10 20 40

>>> d, e, f = (4, 7, 9)

>>> print(d, e, f)

4, 7, 9

 

리스트와 튜플의 요소를 변수 여러 개에 할당하는 것을 리스트 언패킹, 튜플 언패킹이라 한다.

>>> x = [1, 2, 3]

>>> a, b, c = x

>>> print( a, b, c )

1 2 3

>>> y = (4, 5, 6)

>>> d, e, f = y

>>> print(d, e, f)

4 5 6

 

# input().split()은 리스트를 반환한다. -> 리스트 언패킹 형식 사용 가능.

>>> input().split()

10 20

['10', '20']

>>> x = input().split()

10 20

>>> a, b = x

>>> print(a, b)

10 20

+ Recent posts