스토쿠 검사

📄 문제

스도쿠는 매우 간단한 숫자 퍼즐이다.
9×9 크기의 보드가 있을 때, 각 행과 각 열,
그리고 9 개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다.
예를 들어 다음을 보자.


위 그림은 스도쿠를 정확하게 푼 경우이다.
각 행에 1부터 9까지의 숫자가 중복 없이 나오고,
각 열에 1부터 9까지의 숫자가 중복 없이 나오고,
각 3×3짜리 사각형(9개이며, 위에서 색 깔로 표시되었다)에 1부터 9까지의 숫자가 중복 없이 나오기 때문이다.

완성된 9×9 크기의 수도쿠가 주어지면 정확하게 풀었으면 “YES",
잘못 풀었으면 ”NO"를 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫 번째 줄에 완성된 9×9 스도쿠가 주어집니다.

▣ 출력설명
첫째 줄에 “YES" 또는 ”NO"를 출력하세요.

▣ 입력예제
1 4 3 6 2 8 5 7 9
5 7 2 1 3 9 4 6 8
9 8 6 7 5 4 2 3 1
3 9 1 5 4 2 7 8 6
4 6 8 9 1 7 3 5 2
7 2 5 8 6 3 9 1 4
2 3 7 4 8 1 6 9 5
6 1 9 2 7 5 8 4 3
8 5 4 3 9 6 1 2 7

▣ 출력예제
YES

🧞 풀이 (실패: 45 합을 기준으로 했는데 반례 존재)

더보기
# 실패
# 45 합을 기준으로 만든 수도쿠
# 값이 중복되더라도 합이 45가 되는 반례가 존재함

'''
각 사각형의 합

a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]

a[0][3] a[0][4] a[0][5]
a[1][3] a[1][4] a[1][5]
a[2][3] a[2][4] a[2][5]

a[0][6] a[0][7] a[0][8]
a[1][6] a[1][7] a[1][8]
a[2][6] a[2][7] a[2][8]

a[3][0] a[3][1] a[3][2]
a[4][0] a[4][1] a[4][2]
a[5][0] a[5][1] a[5][2]

a[3][3] a[3][4] a[3][5]
a[4][3] a[4][4] a[4][5]
a[5][3] a[5][4] a[5][5]

a[3][6] a[3][7] a[3][8]
a[4][6] a[4][7] a[4][8]
a[5][6] a[5][7] a[5][8]

a[6][0] a[6][1] a[6][2]
a[7][0] a[7][1] a[7][2]
a[8][0] a[8][1] a[8][2]

a[6][3] a[6][4] a[6][5]
a[7][3] a[7][4] a[7][5]
a[8][3] a[8][4] a[8][5]

a[6][6] a[6][7] a[6][8]
a[7][6] a[7][7] a[7][8]
a[8][6] a[8][7] a[8][8]

3개 * 3개 만큼 이중반복하면 될 듯!

'''

sudoku = [list(map(int, input().split())) for _ in range(9)]

cnt1 = 0
cnt2 = 0
cnt3 = 0

for i in range(9):
    print(sum(sudoku[i]))
    if sum(sudoku[i]) == 45:
        cnt1 = 0
    else:
        cnt1 = 1

    tmp = 0
    for j in range(9):
        tmp += sudoku[j][i]
    print(tmp)
    if tmp == 45:
        cnt2 = 0
    else:
        cnt2 = 1

for l1 in range(3):
    for l2 in range(3):
        tmp2 = 0
        tmp2 += sudoku[l1 * 3][l2 * 3]
        tmp2 += sudoku[l1 * 3][l2 * 3 + 1]
        tmp2 += sudoku[l1 * 3][l2 * 3 + 2]
        tmp2 += sudoku[l1 * 3 + 1][l2 * 3]
        tmp2 += sudoku[l1 * 3 + 1][l2 * 3 + 1]
        tmp2 += sudoku[l1 * 3 + 1][l2 * 3 + 2]
        tmp2 += sudoku[l1 * 3 + 2][l2 * 3]
        tmp2 += sudoku[l1 * 3 + 2][l2 * 3 + 1]
        tmp2 += sudoku[l1 * 3 + 2][l2 * 3 + 2]
        print(tmp2)
        if tmp2 == 45:
            cnt3 = 0
        else:
            cnt3 = 1

if cnt1 == 1 or cnt2 == 1 or cnt3 == 1:
    print('NO')
else:
    print('YES')

 

다른 사람 풀이

# 행을 체크하는 리스트
# 열을 체크하는 리스트
# 그룹을 체크하는 리스트를 만들어서 확인

'''
ch = [0] * 10
ch1 행
ch2 얄
ch3 그룹
ch[a[i][j]] = 1
sum(ch) != 9
잘못된 스토쿠임
'''

def check(tmp):
    for i in range(9):
        ch1 = [0] * 10
        ch2 = [0] * 10
        for j in range(9):
            ch1[a[i][j]] = 1
            ch2[a[j][i]] = 1
        if sum(ch1) != 9 or sum(ch2) != 9:
            return False
    for i in range(3):
        for j in range(3):
            ch3 = [0] * 10
            for k in range(3):
                for s in range(3):
                    ch3[a[i*3 + k][j*3 + s]] = 1
            if sum(ch3) != 9:
                return False
    return True

a = [list(map(int, input().split())) for _ in range(9)]

if check(a):
    print('YES')
else:
    print('NO')

 

 

봉우리

📄 문제

지도 정보가 N*N 격자판에 주어집니다.
각 격자에는 그 지역의 높이가 쓰여있습니다.
각 격자 판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다.
봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정합니다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.

▣ 입력설명
첫 줄에 자연수 N이 주어진다.(1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.
각 자연수는 100을 넘지 않는 다.

▣ 출력설명
봉우리의 개수를 출력하세요.

▣ 입력예제
5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2

▣ 출력예제
10

🧞 풀이

더보기

풀이

n = int(input())                                                                # 정수 n 입력 및 할당
a = [list(map(int, input().split())) for _ in range(n)]                         # 값들 입력 받아 배열 할당
a.insert(0, [0] * (n + 2))                                                      # 맨 윗 줄에 0으로 된 행 넣기
a.append([0] * (n + 2))                                                         # 맨 아랫 줄에도 0으로 된 행 넣기
for i in range(1, n+1):                                                         # 1부터 n까지 반복
    a[i].insert(0, 0)                                                           # 각 행 첫 부분에 0 추가
    a[i].append(0)                                                              # 각 행 끝 부분에 0 추가

cnt = 0                                                                         # 봉우리 갯수 세기 위한 cnt 할당

for j in range(1, n+1):                                                         # 1부터 n까지 반복
    for k in range(1, n+1):                                                     # 이중반복문
        p = a[j][k]                                                             # 봉우리 검사를 위한 p 할당
        if p > a[j][k+1] and p > a[j][k-1] and p > a[j+1][k] and p > a[j-1][k]: # p를 상하좌우랑 비교했을 때 모두 큰 값이면
            cnt += 1                                                            # cnt를 1만큼 증가

print(cnt)                                                                      # 계산을 통해 얻은 봉우리 갯수 출력

 

다른 사람 풀이

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
a.insert(0, 0 * n)
a.append([0] * n)
for x in a:
    x.insert(0, 0)
    x.append(0)

cnt = 0
for i in range(1, n+1):
    for j in range(1, n+1):
        if all(a[i][j] > a[i+dx[k]][j+dy[k]] for k in range(4)):
            cnt += 1

print(cnt)

곳감(모래시계)

📄 문제

현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있습니다.
현수의 마당은 N*N 격자판으 로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정합니다.
그런데 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다.
그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다. 만약 회전명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 아래 그림처럼 회전시키는 명령 입니다.

첫 번째 수는 행번호,
두 번째 수는 방향인데 0이면 왼쪽,
1이면 오른쪽이고,
세 번째 수는 회전하는 격자의 수입니다.
M개의 회전명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는
감이 총 몇 개가 있는지 출력하는 프로그램을 작성하세요.



▣ 입력설명
첫 줄에 자연수 N(3<=N<=20) 이 주어며, N은 홀수입니다.
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어집니다.
이 자연수는 각 격자안에 있는 감의 개수이며, 각 격자안의 감의 개수는 100을 넘지 않습니다.
그 다음 줄에 회전명령의 개수인 M(1<=M<=10)이 주어지고,
그 다음 줄부터 M개의 회전명령 정보가 M줄에 걸쳐 주어집니다.

▣ 출력설명
총 감의 개수를 출력합니다.

▣ 입력예제
5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19
3
2 0 3
5 1 2
3 1 4

▣ 출력예제
362

🧞 풀이

더보기

풀이

'''
예를 들어, 2 0 3
0 1 2 3 4
3 4 0 1 2

3 -> 3 - 3 = 0
4 -> 4 - 3 = 0
2 -> 2 - 3 = -1 -> 4 == len() + (2 - 3)
1 -> 1 - 3 = -2 -> 3 == len() + (1 - 3)
0 -> 0 - 3 = -3 -> 2 == len() + (0 - 3)

한편, 2 1 3
0 1 2 3 4
2 3 4 0 1

0 -> 0 + 3 = 3
1 -> 1 + 3 = 4

2 -> 2 + 3 = 5 -> 1 = 5 - 4
3 -> 3 + 3 = 6 -> 2 = 6 - 4
4 -> 4 + 3 = 7 -> 3 = 7 - 4
'''

# 입력: 첫 줄 - N, 둘 째줄부터 N째줄까지 자연수 N개, 이후 M, M줄의 회전 명령
# 출력: 총 감의 개수

n = int(input())                                        # 정수 n 입력 및 할당
array = []                                              # 빈 array 할당
for i in range(n):                                      # n만큼 반복
    array.append(list(map(int,input().split())))        # array에 숫자 입력하여 추가

m = int(input())                                        # 정수 m 입력 및 할당
for i in range(m):                                      # m만큼 반복
    a, b, c = map(int, input().split())                 # a, b, c 입력 및 할당
    if b == 0:                                          # b가 0이면 왼쪽으로 회전
        for _ in range(c):                              # c만큼 반복
            array[a-1].append(array[a-1][0])            # 제일 왼쪽의 숫자를 제일 오른쪽에 추가
            array[a-1].pop(0)                           # 제일 왼쪽의 숫자 pop()으로 제거

    else:                                               # b가 1이면 오른쪽으로 회전
        for _ in range(c):                              # c만큼 반복
            array[a-1].insert(0, array[a-1][-1])        # 제일 오른쪽의 숫자를 제일 왼쪽에 추가
            array[a-1].pop()                            # 제일 오른쪽의 숫자 pop()으로 제거

s = 0                                                   # 시작 포인터: 0으로 할당
e = n                                                   # 끝 포인터: n으로 할당 (슬라이싱을 위해 n-1이 아닌, n)

sum_result = 0                                          # 합을 담을 sum_result 변수 0으로 할당

for j in range(n):                                      # n만큼 반복
    sum_result += sum(array[j][s:e])                    # 해당 조건의 슬라이싱된 리스트의 합을 sum_result에 더해줌
    if j < n // 2:                                      # 절반을 기준으로 위에 있는 행들의 경우,
        s += 1                                          # s는 1씩 커지고
        e -= 1                                          # e는 1씩 작아짐
    else:                                               # 절반을 기준으로 밑에 있는 행들의 경우,
        s -= 1                                          # s는 1씩 작아지고
        e += 1                                          # e는 1씩 커짐

print(sum_result)                                       # 합 출력

 

다른 사람 풀이

n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
m = int(input())
for i in range(m):
    h, t, k = map(int, input().split())
    if t == 0:
        for _ in range(k):
            a[h-1].append(a[h-1].pop(0))

    else:
        for _ in range(k):
            a[h-1].insert(0, a[h-1].pop())

res = 0
s = 0
e = n - 1
for i in range(n):
    for j in range(s, e+1):
        res += a[i][j]
    if i < n // 2:
        s += 1
        e -= 1
    else:
        s -= 1
        e += 1

print(res)

사과나무(다이아몬드)

📄 문제

현수의 농장은 N*N 격자판으로 이루어져 있으며, 각 격자안에는 한 그루의 사과나무가 심어저 있다.
N의 크기는 항상 홀수이다.
가을이 되어 사과를 수확해야 하는데 현수는 격자판안의 사과를 수확할 때
다이아몬드 모양의 격자판만 수확하고 나머지 격자안의 사과는 새들을 위해서 남겨놓는다.
만약 N이 5이면 아래 그림과 같이 진한 부분의 사과를 수확한다.

현수과 수확하는 사과의 총 개수를 출력하세요.

▣ 입력설명
첫 줄에 자연수 N(홀수)이 주어진다.(3<=N<=20)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.
이 자연수는 각 격자안에 있는 사과나무에 열린 사과의 개수이다.
각 격자안의 사과의 개수는 100을 넘지 않는다.

▣ 출력설명
수확한 사과의 총 개수를 출력합니다.

▣ 입력예제
5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

▣ 출력예제
379

🧞 풀이

더보기

풀이

# 입력: 첫 줄 - N (홀수), 두 번째 줄부터 N번째 줄까지 N개의 자연수
# 출력: 수확한 총 사과 개수

'''
만약 7이면,
1 3 5 7 5 3 1

만약 9이면,
1 3 5 7 9 7 5 3 1
'''

n = int(input())                                                            # 정수 n 입력 및 할당
array = []                                                                  # 빈 array 할당
list_s = []                                                                 # list_s 할당

for i in range(n):                                                          # n만큼 반복
    array.append(list(map(int,input().split())))                            # array에 각 행의 숫자 추가

for i in range(n):                                                          # n만큼 반복
    if i <= int(n/2):                                                       # 위의 절반 줄의 경우에는
        list_s.append(sum(array[i][int(n/2)-i:int(n/2)+1+i]))               # 해당 조건만큼만 슬라이싱해서 더함
    else:                                                                   # 반대로 밑의 절반 줄의 경우에는
        list_s.append(sum(array[i][int(n/2)-(n-i-1):int(n/2)+1+(n-i-1)]))   # 해당 조건만큼만 슬라이싱해서 더함

print(sum(list_s))                                                          # 합을 구하여 출력

 

다른 사람 풀이

n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
res = 0

s = e = n // 2

for i in range(n):
    for j in range(s, e + 1):
        res += a[i][j]
    if i < n // 2:
        s -= 1
        e += 1
    else:
        s += 1
        e -= 1

print(res)

격자판 최대합

📄 문제

▣ 입력설명
첫 줄에 자연수 N이 주어진다. (1<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.
각 자연수는 100을 넘지 않는 다.

▣ 출력설명
최대합을 출력합니다.

▣ 입력예제
5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

▣ 출력예제
155

🧞 풀이

더보기

풀이

n = int(input())
board = []

for _ in range(n):
    tmp = list(map(int, input().split()))
    board.append(tmp)

max_sum = 0

# 가로 합 구해서 최댓값과 비교
for i in board:
    if sum(i) > max_sum:
        max_sum = sum(i)

# 세로 합 구해서 최댓값과 비교
for j in range(n):
    tmp = 0
    for k in range(n):
        tmp += board[k][j]
        if tmp > max_sum:
            max_sum = tmp

# 정방향 대각선 합 구해서 최댓값과 비교
tmp2 = 0
for l in range(n):
    tmp2 += board[l][l]
if tmp2 > max_sum:
    max_sum = tmp2

# 역방향 대각선 합 구해서 최댓값과 비교
tmp3 = 0
for m in range(n):
    tmp3 += board[m][n-1-m]
if tmp3 > max_sum:
    max_sum = tmp3

print(max_sum)

 

풀이 2

# 앞의 풀이와 크게 다르지 않음

# 입력: 첫 줄 - N, 두 번째부터 N번째까지 N개의 자연수
# 출력: 최대합 출력

n = int(input())                                        # 정수 n 입력 및 할당

array = []                                              # 숫자를 담을 빈 array 할당
list_s = []                                             # 합을 담을 list_s 할당

for i in range(n):                                      # n만큼 반복
    array.append(list(map(int,input().split())))        # 숫자 list로 변환하여 2차원 배열에 담기

for i in array:                                         # array 요소만큼 반복
    list_s.append(sum(i))                               # 각 행의 합 구하여 list_s에 추가

for i in range(n):                                      # i 만큼 반복
    tmp = 0                                             # 요소 값을 더할 tmp 할당
    for j in range(n):                                  # 이중반복문
        tmp += array[j][i]                              # 각 열의 합 구하기
    list_s.append(tmp)                                  # list_s에 추가

i = 0
tmp2 = 0
tmp3 = 0
while i < n:                                            # i가 n보다 크지 않을 때 무한 반복
    tmp2 += array[i][i]                                 # tmp2에는 정방향 대각선 합 구하기
    tmp3 += array[n-1-i][i]                             # tmp3에는 역방향 대각선 합 구하기
    i += 1
else:
    list_s.append(tmp2)                                 # list_s에 추가
    list_s.append(tmp3)                                 # list_s에 추가

print(max(list_s))                                      # list_s의 최댓값 출력

 

 

다른 사람 풀이

# 정수 n 입력 및 할당
n = int(input())

# 한 번에 2차원 배열로 만들기
a=[list(map(int, input().split())) for _ in range(n)]

# 가장 작은 값으로 최댓값 할당
largest = -2147000000

# 행과 열 합 구하기
for i in range(n):
    sum1 = sum2 = 0
    for j in range(n):
        sum1 += a[i][j]  # 행을 쭉 합하는 것
        sum2 += a[j][i]  # 열을 쭉 합하는 것

    if sum1 > largest:
        largest = sum1
    if sum2 > largest:
        largest = sum2

# 대각선 합 구하기
sum1 = sum2 = 0
for i in range(n):
    sum1 += a[i][i]
    sum2 += a[i][n-i-1]

if sum1 > largest:
    largest = sum1
if sum2 > largest:
    largest = sum2

print(largest)

수들의 합

📄 문제

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다.
이 수열의 i번째 수부터 j번째 수까지의 합 A[i]+A[i+1]+…+A[j-1]+A[j]가 M이 되는
경우의 수를 구하는 프로그램을 작성하시오.

▣ 입력설명
첫째 줄에 N(1≤N≤10,000), M(1≤M≤300,000,000)이 주어진다.
다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다.
각각의 A[x]는 30,000을 넘지 않는 자연수이다.

▣ 출력설명
첫째 줄에 경우의 수를 출력한다.

▣ 입력예제
8 3 1 2 1 3 1 1 1 2

▣ 출력예제
5

🧞 풀이

더보기

풀이 (시간 초과)

# 입력: 첫째 줄 - N, M, 둘째 줄 - 수열 나열
# 출력: 합이 M이 되는 경우의 수 출력

n, m = map(int, input().split())        
list_n = list(map(int, input().split()))
a = 0

for i in range(n):
    for j in range(i+1, n+1):
        if sum(list_n[i:j]) == m:
            a += 1

print(a)

 

다른 사람 풀이

# 연속적인 부분 수열의 합이 m과 같은 경우 출력
# 포인터 각각 할당 lt, rt

n, m = map(int, input().split())
a = list(map(int, input().split()))
lt = 0                              # 포인터 lt 할당
rt = 1                              # 포인터 rt 할당
tot = a[0]                          # tot 초기값: a[0]
cnt = 0                             # 개수 세기 위한 cnt 할당

while True:                         # break 되기 전까지 반복
    if tot < m:                     # 합이 m보다 작을 경우
        if rt < n:                  # rt가 n보다 작을 경우
            tot += a[rt]            # tot에 a[rt] 값 더해줌
            rt += 1                 # rt 포인터 1만큼 증가
        else:                       # rt가 n보다 크거나 같으면
            break                   # 반복문 종료

    elif tot == m:                  # 만약 합이 m과 같으면
        cnt += 1                    # cnt 1 증가
        tot -= a[lt]                # tot에서 a[lt] 값 빼줌
        lt += 1                     # lt 1 증가

    else:                           # 만약 합이 m보다 크면
        tot -= a[lt]                # cnt 증가 없이 a[lt] 값 빼줌
        lt += 1                     # lt 1 증가

print(cnt)                          # cnt 출력

두 리스트 합치기

📄 문제

오름차순으로 정렬이 된 두 리스트가 주어지면
두 리스트를 오름차순으로 합쳐 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫 번째 줄에 첫 번째 리스트의 크기 N(1<=N<=100)이 주어집니다.
두 번째 줄에 N개의 리스트 원소가 오름차순으로 주어집니다.
세 번째 줄에 두 번째 리스트의 크기 M(1<=M<=100)이 주어집니다.
네 번째 줄에 M개의 리스트 원소가 오름차순으로 주어집니다.
각 리스트의 원소는 int형 변수의 크기를 넘지 않습니다.

▣ 출력설명
오름차순으로 정렬된 리스트를 출력합니다.

▣ 입력예제
3
1 3 5
5
2 3 6 7 9

▣ 출력예제
1 2 3 3 5 6 7 9

🧞 풀이

더보기

풀이

# 입력: N, N개의 리스트 원소, M, M개의 리스트 원소
# 출력: 오름차순으로 정렬된 리스트 출력

n = int(input())                            # 정수 n 할당
list_n = list(map(int, input().split()))    # 리스트 list_n 입력 및 할당
m = int(input())                            # 정수 m 할당
list_m = list(map(int, input().split()))    # 리스트 list_m 입력 및 할당

sum = [*list_n, *list_m]                    # 두 리스트 언패킹하여 다시 리스트로 묶어줌
sum = sorted(sum)                           # sorted()를 통해 오름차순 정렬
print(*sum, sep = ' ')                      # 언패킹하여 공백 하나 기준으로 값들 출력

 

다른 사람 풀이

# sort() 함수는 시간복잡도가 nlogn
# 이를 n으로 줄이는 방법

n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = list(map(int, input().split()))

p1 = p2 = 0
c = []
while p1 < n and p2 < m:
    if a[p1] <= b[p2]:
        c.append(a[p1])
        p1 += 1
    else:
        c.append(b[p2])
        p2 += 1

if p1 < n:
    c = c + a[p1:]
if p2 < m:
    c = c + b[p2:]

for x in c:
    print(x, end = ' ')

문제 제목

📄 문제

▣ 입력설명
총 10개의 줄에 걸쳐 한 줄에 하나씩 10개의 구간이 주어진다.
i번째 줄에는 i번째 구간의 시 작 위치 ai와 끝 위치 bi가 차례대로 주어진다.
이때 두 값의 범위는 1 ≤ ai ≤ bi ≤ 20이다.

▣ 출력설명
1부터 20까지 오름차순으로 놓인 카드들에 대해,
입력으로 주어진 10개의 구간 순서대로 뒤집는 작업을 했을 때 마지막 카드들의 배치를 한 줄에 출력한다.

▣ 입력예제
5 10
9 13
1 2
3 4
5 6
1 2
3 4
5 6
1 20
1 20

▣ 출력예제
1 2 3 4 10 9 8 7 13 12 11 5 6 14 15 16 17 18 19 20

🧞 풀이

더보기

풀이

# 입력: 10개의 줄에 걸쳐, 한 줄에 하나씩 10개의 구간 ai, bi
# 출력: 마지막 카드들의 배치를 한 줄에 출력

# 예를 들어, 5부터 10까지 슬라이싱해서 역순으로 만들려면
# card[10-1:5-2:-1]
# 첫 번째는 포함하기 때문에 인덱스의 -1 차만 빼면 됨
# 두 번째는 포함하지 않기 때문에 인덱스의 -1 차와 -1을 추가로 빼줘야 함

# 그리고 추가로 그 앞 뒤에 있는 인덱스는 그대로 가지고 가면 될 것 같음
# 그렇게 해서 다시 리스트 세 개를 합쳐주면 될 것 같음


card = '1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20'.split()

i = 0

while i < 10:
    i += 1
    a, b = map(int, input().split())
    if a >= 2: # a가 2보다 크거나 같을 때,
        tmp = [card[:a-1], card[b-1:a-2:-1], card[b:]] # 임시 리스트에 바뀐 순서대로 저장
        card = sum(tmp, []) # 초기값을 []로 줘서, 리스트끼리 더하기가 가능하게 함
    else: # a가 1일 때,
        tmp = [card[b-1::-1], card[b:]]
        card = sum(tmp, [])
else:
    print(*card, sep = ' ') # 리스트 압축 풀고, 공백으로 구분해서 출력

 

다른 사람 풀이

a = list(range(21)) # 자동으로 0부터 20까지 리스트가 생김
for _ in range(10): # i 대신 _를 적게 되면 변수 없이 범위만큼 반복하게 됨
    s, e = map(int, input().split())
    for i in range((e-s+1)//2):
        a[s+i], a[e-i] = a[e-i], a[s+i]

a.pop(0)

for x in a:
    print(x, end = ' ')

숫자만 추출

📄 문제

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.
만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.
만약 “t0e0a1c2h0er”에서 숫자만 추출하면 0, 0, 1, 2, 0이고 이것을 자연수를 만들면 120이 됩니다.
즉 첫 자리 0은 자연수화 할 때 무시합니다.
출력은 120를 출력하고, 다음 줄에 120 의 약수의 개수를 출력하면 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

▣ 입력설명
첫 줄에 숫자가 썩인 문자열이 주어집니다.
문자열의 길이는 50을 넘지 않습니다.

▣ 출력설명
첫 줄에 자연수를 출력하고, 두 번째 줄에 약수의 개수를 출력합니다.

▣ 입력예제
g0en2Ts8eSoft

▣ 출력예제
28
6

🧞 풀이

더보기

풀이

# 입력: 문자열 주어짐
# 출력: 첫째 줄 - 자연수 출력; 둘째 줄 - 약수의 개수 출력

from math import sqrt

numbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']

w = input()                # 문자열 w 입력 및 할당
w = list(w)                # 문자열 리스트로 변환
a = []                     # 숫자만 담을 빈 리스트 a 할당

for i in w:                # 리스트 w의 각 요소 반복
    if i in numbers:       # i가 numbers 안의 요소에 해당한다면
        a.append(i)        # 이를 a에 추가

a = int(''.join(a))        # join()을 통해 각 요소를 묶어 정수형으로 변환

cnt = 0                    # 개수 세기 위한 cnt 할당

for i in range(1, a + 1):  # a만큼 반복
    if a % i == 0:         # a가 i로 나눠진다면 = 약수
        cnt += 1           # cnt 1 추가

print(a)                   # a 출력
print(cnt)                 # 약수의 개수 cnt 출력

 

다른 사람 풀이

s = input()
res = 0
for x in s:
    if x.isdecimal():
        res = res * 10 + int(x)
print(res)
cnt = 0
for i in range(1, res + 1):
    if res % i == 0:
        cnt += 1
print(cnt)

+ Recent posts