본문 바로가기
Problem Solving/SWEA

[ SWEA ] D3 - 1220, 1216, 5601, 10570 - python 문제풀이

by IM조이 2021. 7. 1.

1220 Magnetic
주의 - 답안이랑 내가 푼 답이랑 숫자는 비슷한데 값이 틀리다면 조건을 반대로 바꿔보면 된다... ㅎ
접근 - 생각보다 쉽고 다양한 방법으로 풀 수 있음
방법 1 : 이끌리는 방향의 가장 바깥에 있는 것들을 빼버린 뒤 시작 인덱스와 끝 인덱스만 검토하면서 직전값과 다르면 카운트를 올려주고 값을 갱신해주는 방식
방법 2 : 0을 다 지우고 "12"만 세어주는 방식(어차피 저 바뀌는 부분만 카운트하면되니까)

# 방법 1 - 코드가 길다...
for tc in range(10):
    N = int(input())
    table = [list(input().split()) for _ in range(N)]
    cnt = 0
    before = table[0][0]
    for i in range(N):
        s_idx =0
        for start in range(N):
            if table[start][i] == '1':
                s_idx = start
                break
        e_idx = N-1
        for end in range(N-1,-1,-1):
            if table[end][i] == '2':
                e_idx = end+1
                break
        tmp = '0'
        for j in range(s_idx,e_idx):
            if table[j][i] != '0' and table[j][i] != tmp[-1]:
                tmp += table[j][i]
        cnt += len(tmp)//2
    print("#{} {}".format(tc+1, cnt))

좀 더 깔끔한 방법

# 방법 2
for tc in range(10):
    N = int(input())
    table = [list(input().split()) for _ in range(N)]
    cnt = 0
    for i in range(N):
        tmp = ''
        for j in range(N):
            tmp += table[j][i]
        cnt += tmp.replace("0","").count("12")
    print("#{} {}".format(tc+1, cnt))

 

순서 : 방법2, 방법1, 매번append하는 방법3  

메모리, 속도, 길이 모두를 고려했을때 count를 활용하는 방법이 깔끔

 

1216 회문2

for tc in range(10):
    N = int(input())
    characters = [list(input()) for _ in range(100)]
    characters2 = [[characters[i][j] for i in range(100)] for j in range(100)]
    cnt = 100
    found = False
    while cnt >= 1:
        for m in range(100-cnt+1):
            for n in range(100-cnt+1):
                if characters[m][n:n+cnt]==characters[m][n:n+cnt][::-1]:
                    found = True
                if characters2[m][n:n+cnt]==characters2[m][n:n+cnt][::-1]:
                    found = True
        if found == True:
            break
        cnt -= 1
    print("#{} {}".format(N, cnt))

 

5601 쥬스 나누기
그냥 수학 문제. 상식적으로 최대한 마시려면 결국 모두 다 동일하게 나눠마셔야 함.

for tc in range(int(input())):
    N = int(input())
    print("#{}{}".format(tc+1, (" 1/"+str(N))*N))


10570 제곱팰린드롬수
주어진 범위를 활용해서 미리 가능한 값을 포함하는 배열을 만들어놓고 풀어도 되고 그냥 매번 판별해도 되기는 함

for tc in range(int(input())):
    A,B = map(int, input().split())
    N = 1
    cnt = 0
    while N**2<=B:
        if N**2 >= A:
            tmp = str(N)
            if tmp == tmp[::-1]:
                tmp = str(N**2)
                if tmp == tmp[::-1]:
                    cnt +=1
        N += 1
    print("#{} {}".format(tc+1, cnt))

 

댓글