BOJ : 2667 단지번호붙이기, Python : strip-rstrip 차이

김가영·2020년 10월 5일
0

Algorithm

목록 보기
3/78
post-thumbnail

단지 번호 붙이기


import sys


def isVisitable(x, y):
    if x < 0 or x >= len_map or y < 0 or y >= len_map:
        return False
    if list_map[y][x] == 1:
        return True
    else:
        return False


def visitAll(x_pos, y_pos):
    global list_map
    visit_count = 1

    visit_list = [(x_pos, y_pos)]
    list_map[y_pos][x_pos] = 0

    x_list = [1, -1, 0, 0]
    y_list = [0, 0, 1, -1]

    while len(visit_list) != 0:
        a, b = visit_list.pop()
        for (x, y) in zip(x_list, y_list):
            new_x = a + x
            new_y = b + y
            if isVisitable(new_x, new_y):
                # print(new_x,new_y, "visitable")
                list_map[new_y][new_x] = 0
                visit_list.append((new_x, new_y))
                visit_count += 1
    return visit_count


len_map = int(sys.stdin.readline())

list_map = []

for _ in range(len_map):
    a = list(map(int, list(sys.stdin.readline().strip())))
    list_map.append(a)

answer = list()

for i in range(len_map):
    for j in range(len_map):
        if isVisitable(i, j):
            # print(i,j)
            visit_count = visitAll(i, j)
            answer.append(visit_count)

answer.sort()
print(len(answer))
for ans in answer:
    print(ans)

isVisitable(x,y) : x, y 위치의 점에 집이 있으면 true, 없으면 false 값을 return 한다.
visitAll(x,y) : 주어진 x,y와 연결된 모든 위치를 방문하여 집이 있는 지 확인하고, 방문한 곳을 모두 0 (집이 없는 것처럼) 만든다. 집이 있는 위치의 개수를 return 한다.


예전에 푼 거


import sys
n = int(sys.stdin.readline())

houses = [list(map(int, list(sys.stdin.readline().rstrip()))) for i in range(n)]
answer = list()


def checkList(a, b):
    ans = list()
    if a > 0:
        ans.append([a - 1, b])
    if a < n - 1:
        ans.append([a + 1, b])
    if b > 0:
        ans.append([a, b - 1])
    if b < n - 1:
        ans.append([a, b + 1])
    return ans


def exist(x):
    a, b = x
    return True if houses[a][b] == 1 else 0


def check(list_, visited):
    a, b = list_
    visited.append([a, b])
    new_visit = []
    new_visit.append(list_)
    global houses
    for dot in checkList(a, b):
        if exist(dot) and dot not in visited:
            new_visit.extend(check(dot, visited))
    return new_visit


def delete(list_):
    global houses
    for dot in list_:
        x, y = dot
        houses[x][y] = 0


for i in range(n):
    for j in range(n):
        if exist([i, j]):
            x = check([i, j], [])
            answer.append(len(x))
            delete(x)

print(len(answer))
answer.sort()
for i in answer:
    print(i)

최근 것보다 좀 더 오래걸렸다. 최근 건 방문한 집을 0으로 바꿨고, 여기에선 방문한 집을 visited 라는 list에 저장하여 방문 여부를 판단했다. 여기에서 함수를 좀 더 깔끔하게 쓴 것 같다.


Python : strip(), rstrip() 차이

strip() : 문자열 양끝 공백문자 제거
rstrip() : 문자열 오른쪽 공백문자 제거
lstrip() : 문자열 왼쪽 공백문자 제거

profile
개발블로그

0개의 댓글