여니의 취준 준비/코딩테스트 (Python)

[n11504] 돌려 돌려 돌림판 in python

여니's 2021. 10. 8. 17:00


ex[0]은 x의 맨 앞자리 수

ey[0]은 y의 맨 앞자리 수

 

new_array를 만들어서 idx 에러 방지함

 

사실 index를 어떤식으로 처리해야 하나 고민했음.

 

예제1)

array가 [3 7 8 3 1 9 2 7]라고 생각해본다.

m = 3

x= 200

y=311

 

z가 x보다 크면서 같고, y보다 작으면서 같을 경우에만

카운트를 진행한다.

 

따라서 x의 맨 앞자리 수 2와

y의 맨 앞자리수 3을 이용하면

손쉽게 값을 구할 수 있다.

 

리스트에서 2의 위치를 전부 찾는다.

6번째 위치에서부터 시작해서

총 3번의 이동을 통해 z를 만들어야한다.

 

그리하여 z의 값은

2 7 3

 

7이 리스트의 맨끝이니까

앞으로 다시 돌아가야하는데

이 과정을 코드로 작성하니 좀 지저분해서

new_array를 만들었다.

 

array + array[:m-1]을 해주면

딱 필요한 만큼만 array의 길이를 늘릴 수 있다.

m-1개만큼 뒤로 가져오는 이유는

7에서부터 시작해야할 경우를 생각해줘야하기 때문이다.

 

new array = [3 7 8 3 1 9 2 7 3 7]

 

 

 

이 문제를 풀면서 난감했던 점

1. 해당 value의 모든 idx값을 찾아내는 것

-> enumerate을 이용

idx=[i for i,value in enumerate(array) if value==k]

k와 value의 값이 같은 경우 i를 idx 리스트에 삽입

 

 

2. 입력값으로 받은 값을 int형으로 합쳐서 변수에 집어넣는 것

-> join 연산 사용

x=int(''.join([i for i in ex])

ex의 변수들을 문자열로 붙여서 int형으로 만드는 과정

ex=[1,2,3]이면

int형 123을 x에 집어넣는 것!

 

t = int(input())
for i in range(t):
    n, m = map(int, input().split())
    ex = input().split()
    x = int(''.join([i for i in ex]))

    ey = input().split()
    y = int(''.join([i for i in ey]))

    array = input().split()
    new_array = array + array[:m - 1]
    result = 0

    for k in range(int(ex[0]), int(ey[0]) + 1):
        idx = [i for i, value in enumerate(array) if int(value) == k]
        for j in idx:
            now = int(''.join(new_array[j:j + m]))
            if x <= now <= y:
                result += 1
    print(result)

index 상관 없이 모든 경우를 for문으로 돌린 코드

t = int(input())
for _ in range(t):
    n, m = map(int, input().split())
    x = int(''.join(input().split()))
    y = int(''.join(input().split()))
    array = input().split()
    new_array = array + array[:m - 1]
    result = 0
    cnt = 0
    for i in range(n):
        result = int(''.join(new_array[i:i + m]))
        if x <= result <= y:
            cnt += 1
    print(cnt)