728x90

삼성 SW 역량 테스트 기출 문제인 14890번 문제

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

 

from sys import stdin
n, l = list(map(int, stdin.readline().split()))
li = []
for i in range(n):
    li.append(list(map(int, stdin.readline().split())))
count = 0
for i in range(n):
    previous = -1
    seq = []
    maximum = -1
    for j in range(n):
        if j == 0:
            maximum = li[i][j]
            seq.append([li[i][j], 1])
        else:
            if li[i][j] > maximum:
                maximum = li[i][j]
            if previous == li[i][j]:
                seq[-1][1] = seq[-1][1] + 1
            else:
                seq.append([li[i][j], 1])
        previous = li[i][j]
    if len(seq) == 1:
        count += 1
    elif n / l < len(seq):
        pass
    else:
        for k in range(len(seq)):
            if k > 0 and abs(seq[k - 1][0] - seq[k][0]) != 1:
                break
            elif seq[k][0] != maximum and seq[k][1] < l:
                break
            elif 0 < k < len(seq) - 1:
                if seq[k - 1][0] > seq[k][0] and seq[k + 1][0] > seq[k][0] and seq[k][1] < l * 2:
                    break
            else:
                if k == len(seq) - 1:
                    count += 1
for i in range(n):
    previous = -1
    seq = []
    maximum = -1
    for j in range(n):
        if j == 0:
            maximum = li[j][i]
            seq.append([li[j][i], 1])
        else:
            if li[j][i] > maximum:
                maximum = li[j][i]
            if previous == li[j][i]:
                seq[-1][1] = seq[-1][1] + 1
            else:
                seq.append([li[j][i], 1])
        previous = li[j][i]
    if len(seq) == 1:
        count += 1
    elif n / l < len(seq):
        pass
    else:
        for k in range(len(seq)):
            if k > 0 and abs(seq[k - 1][0] - seq[k][0]) > 1:
                break
            elif seq[k][0] != maximum and seq[k][1] < l:
                break
            elif 0 < k < len(seq) - 1:
                if seq[k - 1][0] > seq[k][0] and seq[k + 1][0] > seq[k][0] and seq[k][1] < l * 2:
                    break
            else:
                if k == len(seq) - 1:
                    count += 1
print(count)

seq의 원소는 [높이, 연속된 개수]로 되어있다.

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 17269번 이름궁합 테스트  (0) 2020.01.18
[백준] 1932번 정수 삼각형  (0) 2020.01.18
[백준] 14503 로봇 청소기  (0) 2020.01.15
[백준] 1149번 RGB 거리  (0) 2020.01.12
[백준] 9461번 파도반수열  (0) 2020.01.12

+ Recent posts