반응형

문제

1부터 20까지 숫자가 하나씩 쓰인 20장의 카드가 아래 그림과 같이 오름차순으로 한 줄로 놓여있다. 각 카드의 위치는 카드 위에 적힌 숫자와 같이 1부터 20까지로 나타낸다. 

이제 여러분은 다음과 같은 규칙으로 카드의 위치를 바꾼다: 구간 [a, b] (단, 1 ≤ a ≤ b ≤ 20)가 주어지면 위치 a부터 위치 b까지의 카드를 현재의 역순으로 놓는다.

예를 들어, 현재 카드가 놓인 순서가 위의 그림과 같고 구간이 [5, 10]으로 주어진다면, 위치 5부터 위치 10까지의 카드 5, 6, 7, 8, 9, 10을 역순으로 하여 10, 9, 8, 7, 6, 5로 놓는다. 이제 전체 카드가 놓인 순서는 아래 그림과 같다.

이 상태에서 구간 [9, 13]이 다시 주어진다면, 위치 9부터 위치 13까지의 카드 6, 5, 11, 12, 13을 역순으로 하여 13, 12, 11, 5, 6으로 놓는다. 이제 전체 카드가 놓인 순서는 아래 그림과 같다.

오름차순으로 한 줄로 놓여있는 20장의 카드에 대해 10개의 구간이 주어지면, 주어진 구간의 순서대로 위의 규칙에 따라 순서를 뒤집는 작업을 연속해서 처리한 뒤 마지막 카드들의 배치를 구하는 프로그램을 작성하시오.

 

정답

import sys
sys.stdin = open('input.txt', 'rt')
num = list(range(1, 21))

for i in range(10):
    n, k = map(int, input().split())

    n = n-1
    k = k-1
    y = ((n + k) // 2)+1
    for j in range(n, y):
        tmp = num[j]
        #print('tmp = ', tmp, end=' ')

        num[j] = num[k]
        #print('num[i] = ', num[i], end=' ')

        num[k] = tmp
        #print('num[k] = ', num[k])
        k -= 1
    #print(n+1, k+1,')',i,'번째', num)


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

 

 

반응형
반응형

'문자열 회물을 확인한다 '란 문자열이 앞으로 읽으나, 뒤로 읽으나 같은 것인지 확인하는 것입니다.

예를 들어 AbbA, LeveL, LooL 등 과 같은 단어입니다.

 

자료구조 수업 때 배웠던 기억이 있어서 비교적 쉽게 구현했지만, 보다 파이썬스러운 방법이 있기에 기록합니다.

 

학부 수업때 배운 방법을 바탕으로 작성한 방법입니다.

import sys
sys.stdin=open("input.txt", "r")
n = int(input())
check = 0
for i in range(n):
    s = input()
    s = s.upper()
    
    for j in range(len(s)//2):
        if s[j] != s[-1-j] :
            check += 1
    if check == 0:
        print('#%d YES' %(i+1))
        check = 0
    else:
        print('#%d NO' %(i+1))
        check = 0

파이썬스럽게 간랸한 방법으로 작성한 코드입니다.

import sys
sys.stdin=open("input.txt", "r")
n = int(input())
check = 0
for i in range(n):
    s = input()
    s = s.upper()
    
    if s==s[::-1]:
        print('#%d YES' %(i+1))
    else:
        print('#%d NO' %(i+1))

 

반응형
반응형

올해 4학년이 되기도 하였고, 하반기에 취업을 성공하여 학교를 편하게 다니고 싶은 마음이 컸습니다.(진심 200%)

 

그래서 인터넷에서 추천하는 알고리즘 공부 방법을 많이 찾아보았고, 현재 컴퓨터공학을 전공하고 있기에 약간의 근거있는 자신감이 있었습니다.

 

일단 나동빈님께서 추천하신 방법은

 

  1. 코드업 기초 100제
  2. 백준 그리디, 동적 프로그래밍
  3. 코드포스의 Blue Level
  4. 나동빈님의 온라인 강의

그래서 코드업 기초 100제를 파이썬으로 해결해보았고 백준 그리디로 넘어갔습니다. 하지만 놀랍게도 아무것도 못했습니다..ㅎ..

 

현재 나의 실력을 몰라서 그러지 않을까? 하는 생각에 프로그래머스에 레벨 테스트를 해봤습니다. 레벨 1 문제도 시간이 엄~~~청 부족했습니다.

 

그래 처음부터 다시하자.. 라는 생각에 이것 저것 찾아봤습니다. 삼성 SW Expert Academy 를 찾게 되었고 여기서도 레벨 테스트를 해봤는데 초심자가 나왔습니다...ㅎ_ㅎ 충격...

 

무료 강의가 있으니 기본강좌와 함께 백준 알고리즘을 병행하는 것이 큰 도움이 될 것 같습니다.

 

정보처리기사 시험을 앞두고 있어, 많은 시간을 투자할 지 모르겠지만.. Upgrade된 실력이 있었으면 좋겠습니다.

아무도 안 들어오는 Blog 지만 알고리즘에 대한 Know-how 알고 계시면 댓글로 부탁드리겠습니다.

 

빠이-

 

반응형
반응형

1098 : [기초-2차원배열] 설탕과자 뽑기

https://codeup.kr/problem.php?id=1098

 

# -*- Encoding:UTF-8 -*- #

'''
input()
1) 바둑판 x,y
2) 막대 개수
3) 길이 방향 좌표

첫 줄에 격자판의 세로(h), 가로(w) 가 공백을 두고 입력되고,
두 번째 줄에 놓을 수 있는 막대의 개수(n)
세 번째 줄부터 각 막대의 길이(l), 방향(d), 좌표(x, y)가 입력된다.
방향(d) 가로:0 세로1

'''

# 바둑판 input()
scan = input().split()
xy = list(map(int, scan))

# 바둑판 초기화
board = [
    [0 for cols in range(xy[1])]
    for width in range(xy[0])
]

# 막대개수
repeat = int(input())

# 막대놓기
for i in range(repeat):
    scan = input().split()
    stick = list(map(int, scan))

    # 가로 놓기
    if stick[1] == 0:
        for j in range(stick[0]):
            x = stick[2] - 1
            y = stick[3] - 1
            board[x][y+j] = 1

    # 세로 놓기
    if stick[1] == 1:
        for j in range(stick[0]):
            x = stick[2] - 1
            y = stick[3] - 1
            board[x + j][y] = 1

# 바둑판 출력
for i in range(xy[0]):
    for j in range(xy[1]):
        print(board[i][j], end=' ')
    print()

 

반응형

+ Recent posts