반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
12-27 05:48
관리 메뉴

ImJay

[파이썬/Python] 백준 1652번 누울 자리를 찾아라 본문

백준 - 문제집/대학생 기본반

[파이썬/Python] 백준 1652번 누울 자리를 찾아라

ImJay 2022. 12. 22. 09:17
반응형

[파이썬/Python] 백준 1652번 누울 자리를 찾아라

 

1652번: 누울 자리를 찾아라

첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다.

www.acmicpc.net


문제

일 년 동안 세계일주를 하던 영식이는 여행을 하다 너무 피곤해서 근처에 있는 코레스코 콘도에서 하룻밤 잠을 자기로 하고 방을 잡았다.

코레스코 콘도에 있는 방은 NxN의 정사각형모양으로 생겼다. 방 안에는 옮길 수 없는 짐들이 이것저것 많이 있어서 영식이의 누울 자리를 차지하고 있었다. 영식이는 이 열악한 환경에서 누울 수 있는 자리를 찾아야 한다. 영식이가 누울 수 있는 자리에는 조건이 있다. 똑바로 연속해서 2칸 이상의 빈 칸이 존재하면 그 곳에 몸을 양 옆으로 쭉 뻗으면서 누울 수 있다. 가로로 누울 수도 있고 세로로 누울 수도 있다. 누울 때는 무조건 몸을 쭉 뻗기 때문에 반드시 벽이나 짐에 닿게 된다. (중간에 어정쩡하게 눕는 경우가 없다.)

만약 방의 구조가 위의 그림처럼 생겼다면, 가로로 누울 수 있는 자리는 5개이고, 세로로 누울 수 있는 자리는 4개 이다. 방의 크기 N과 방의 구조가 주어졌을 때, 가로로 누울 수 있는 자리와 세로로 누울 수 있는 자리의 수를 구하는 프로그램을 작성하시오.

해설

문제를 이해하는데 애를 먹을 수 밖에 없었다. 왜 예시 그림에서 가로는 5자리, 세로는 4자리 밖에 안나올까?

그림과 같이 칸이 몇개가 남든 연속적으로 남는다면 자리수는 한자리로 취급된다.

만약 ..X.. 와 같이 두칸이 벽 하나를 두고 있다면 두자리로 취급된다.

문제 해석이 된다면 쉽게 문제를 풀 수 있다.

코드

def findRow(list):
    count = 0
    rowCount = 0
    for char in list:
        if char in '.':
            count += 1
        else:
            count = 0
        if count == 2:
            rowCount += 1
    return rowCount

def findCol(list):
    colCount = 0
    for i in range(len(list)):
        count = 0
        for j in range(len(list)):
            if list[j][i] == '.':
                count += 1
            else:
                count = 0
            if count == 2:
                colCount += 1
    return colCount                

list = []
rowCount, colCount = 0, 0

for N in range(int(input())):
    list.append(list(input()))
    rowCount += findRow(list[N])
colCount += findCol(list)

print(rowCount, colCount)

풀이

def findRow(list):
    count = 0
    rowCount = 0
    for char in list:
        if char in '.':
            count += 1
        else:
            count = 0
        if count == 2:
            rowCount += 1
    return rowCount

1. 가로 자리를 찾는 함수이다.

'.'의 갯수를 count에 저장시키면서 'X'를 만나게 되면 count를 초기화한다.

count가 2가 되면 rowCount(가로 자리)를 1 증가 시킨다.

 

def findCol(list):
    colCount = 0
    for i in range(len(list)):
        count = 0
        for j in range(len(list)):
            if list[j][i] == '.':
                count += 1
            else:
                count = 0
            if count == 2:
                colCount += 1
    return colCount

2. 세로 자리를 찾는 함수이다.

'.'의 갯수를 count에 저장시키면서 'X'를 만나게 되면 count를 초기화한다.

count가 2가 되면 colCount(세로 자리)를 1 증가 시킨다.

 

list = []
rowCount, colCount = 0, 0

for N in range(int(input())):
    list.append(list(input()))
    rowCount += findRow(list[N])
colCount += findCol(list)

print(rowCount, colCount)

3. N만큼 반복하여 한줄씩 입력받아 리스트에 저장한다.

가로자리는 한줄씩 보내도 찾을 수 있기 때문에 바로 보내고, 세로자리는 리스트를 통으로 보낸다.

피드백

문제를 이해할 수가 없어서 처음에 서치를 했다..

많은 문제를 풀어보며 문제 유형에 익숙해질 필요가 있는 것 같다.

 

반응형
Comments