문제:

이 사진은 오래전부터 인터넷에 돌아다니는 사진으로, 작년 전대프연 예선 A번에서는 수학을 정말 못 하는 고등학생인 성원이의 시험지로 소개되었다. 저작권이 있는 사진일 수 있어 알아보기 어렵게 가공했음을 양해 바란다.

 

예선 날짜가 다가오는데도 적당한 A번 문제를 생각하지 못한 출제진은 작년 전대프연 예선 A번을 응용해서 문제를 만들기로 했다. 이를 위해 사진 속 문제를 찾아본 출제진은 해당 문제가 2007학년도 6월 고등학교 1학년 전국연합학력평가 수리 영역 26번임을 알게 되었다.

 

시험지를 내려받고 문제들을 살펴보던 출제진은 아래와 같은 문제를 발견했다.

예상했겠지만, 여러분은 이제 위의 19번 문제 세 번째 줄에 등장하는 수 '1000'을 임의의 자연수로 바꾸었을 때 그에 해당하는 답을 출력하는 프로그램을 작성해야 한다.

입력:

첫 번째 줄에 자연수 n (1<=n<=10^9)이 주어진다.

출력:

첫 번째 줄에 19번 문제 세 번째 줄에 등장하는 수 '1000'을 자연수 n으로 바꾸었을 때 그에 해당하는 답의 번호를 출력한다. 즉, 1 이상 5 이하의 자연수 중 하나를 출력해야 한다.

풀이방법:

구현을 하는 문제다. 

1~5는 숫자 그대로 답이 되는 경우이기 때문에 따로 처리를 했고, 이를 제외해야지 4의 배수로 나머지 경우를 처리를 하기 쉽기 때문에 따로 처리했다.

 6 이상부터는 4의 배수를 기준으로 왼쪽으로 진행, 오른쪽으로 진행하는 층이 바뀌게 된다. (ex 8은 왼쪽 진행, 12는 오른쪽 진행) 4의 배수중 짝수가 왼쪽으로 진행이고, 홀수가 오른쪽 진행이다. 이를 위해서 n을 4로 나눴을 때, 나머지가 2 이상이면 몫을 하나 늘리고, 그 외는 몫을 그대로 사용해서 현재 층을 파악하도록 했다.

 이제 각 층에서는 나머지에 따라서 답을 나오도록 조건문을 만들어주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
= int(input())
if n <= 5:
    print(n)
else:
    p,r = divmod(n,4)
    if r >= 2:
        p+=1
    if p%2:
        if r >= 2:
            print(r)
        else:
            print(r+4)
    else:
        if r%2:
            print(r)
        else:
            print(r+2)
cs

문제링크:

https://www.acmicpc.net/problem/17362

 

17362번: 수학은 체육과목 입니다 2

첫 번째 줄에 19번 문제 세 번째 줄에 등장하는 수 '1000'을 자연수 n으로 바꾸었을 때 그에 해당하는 답의 번호를 출력한다. 즉, 1 이상 5 이하의 자연수 중 하나를 출력해야 한다.

www.acmicpc.net

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]19532. 수학은 비대면강의입니다.  (0) 2020.08.04
[BOJ]2580. 스도쿠  (0) 2020.07.30
[BOJ]18258. 큐2  (0) 2020.07.23
[BOJ]4963. 섬의 개수  (0) 2020.07.21
[Programmers]2020 카카오 인턴십. 보석 쇼핑  (0) 2020.07.16

문제:

풀이방법:

규칙 중 4를 구현하는 것이 핵심인 문제다.

 solution함수는 1,4,7 입력이 들어온다면 왼쪽 엄지손가락을 사용하고, 해당 번호로 left를 이동시키고, 3,6,9가 들어온다면 오른쪽 엄지손가락을 사용하고 right를 이동시킨다. 이제 2,5,8,0이 들어오는 경우 leftDistance와 rightDistance를 사용해서 거리를 계산한다. 더 작은 쪽의 엄지손가락으로 이동을 하고, 만약 같다면 hand의 우선순위에 따라 움직이도록 한다.

 leftDistance는 입력을 해야하는 숫자가 2,5,8,0일 때, 왼쪽 엄지손가락과 거리를 계산하는 함수다.

만약 이전 왼쪽 엄지 손가락이 2,5,8이고 입력해야 할 숫자가 0이라면 각 케이스마다 거리를 return 하게 만들고, 나머지는 두 수의 차를 3으로 나눈 몫을 반환하도록 한다. 왼쪽 엄지 손가락이 1,4,7에 있다면 이를 가운데 키패드로 옮겨주고 leftDistance로 재귀적으로 거리를 계산하도록 만든다. 이제 나머지 케이스인 0에 있거나, 초기 상태인 *에 있던 경우에 대해서만 거리를 계산해주면 된다.

 rightDistance로 leftDistance와 비슷하게 계산을 하도록 한다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
def leftDistance(num,left):
    if left in [2,5,8]:
        if num == 0:
            if left ==2:
                return 3
            elif left == 5:
                return 2
            else:
                return 1
        return abs(left-num)//3
    elif left in [1,4,7]:
        return leftDistance(num,left+1)+1
    else:
        if left == -1:
            if num == 2:
                return 4
            elif num == 5:
                return 3
            elif num == 8:
                return 2
            else:
                return 1
        if num == 0:
            return 0
        elif num == 8:
            return 1
        elif num == 5:
            return 2
        else:
            return 3
        
def rightDistance(num,right):
    if right in [2,5,8]:
        if num == 0:
            if right ==2:
                return 3
            elif right == 5:
                return 2
            else:
                return 1
        return abs(right-num)//3
    elif right in [3,6,9]:
        return rightDistance(num,right-1)+1
    else:
        if right == -1:
            if num == 2:
                return 4
            elif num == 5:
                return 3
            elif num == 8:
                return 2
            else:
                return 1
        if num == 0:
            return 0
        elif num == 8:
            return 1
        elif num == 5:
            return 2
        else:
            return 3
def solution(numbers,hand):
    answer = ""
    left, right = -1-1
    for num in numbers:
        if num in [1,4,7]:
            left = num
            answer += "L"
        elif num in [3,6,9]:
            right = num
            answer += "R"
        else:
            center_l = leftDistance(num,left)
            center_r = rightDistance(num,right)
            distance = center_l-center_r
            if distance > 0:
                right = num
                answer += "R"
            elif distance < 0:
                left = num
                answer += "L"
            else:
                if hand =="right":
                    right = num
                    answer+= "R"
                else:
                    left = num
                    answer += "L"
    return answer
cs

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/67256

 

코딩테스트 연습 - 키패드 누르기

[1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5] "right" "LRLLLRLLRRL" [7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2] "left" "LRLLRRLLLRR" [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] "right" "LLRLLRLLRL"

programmers.co.kr

 

'Algorithm > Python' 카테고리의 다른 글

[BOJ]2164. 카드2  (0) 2020.07.14
[Programmers]2020 카카오 인턴십. 수식 최대화  (0) 2020.07.09
[BOJ]1543. 문서 검색  (0) 2020.07.02
[BOJ]5525. IOIOI  (0) 2020.06.30
[BOJ]11652. 카드  (0) 2020.06.25

2019/01/29 - [Language/Python] - [Python 따라하기]1. Python 설치하기

2019/02/05 - [Language/Python] - [Python 따라하기] 2. 자료형_part 1(String, Int,Float, List)

2019/02/12 - [Language/Python] - [Python 따라하기]3. 자료형_part2(Tuple,Set,Dictionary)

Bool Type

Bool Type은 이전에 소개했던 자료형처럼 참과 거짓을 나타내는 자료형이다.

Bool Type은 Boolean이라고도 부르며 True와 False 두개의 값만을 가진다. 또한 Boolean 연산자로는 and, or, not 이 있다.


not은 부정 연산자로 True면 False를 False이면 True를 리턴한다. 


and는 전부 참일 경우에만 True를 리턴하고 하나의 False만 있어도 False를 리턴한다.


or은 전부 거짓일 경우에만 False를 리턴하고 하나의 True만 있어도 True를 리턴한다.



Relation Operators(관계 연산자)

관계 연산자란 흔히 알고 있는 > , < , >=, 등을 일컫는다. 연산자의 리턴 값은 Bool이다.


관계 연산자 중 '같다' 가 수학에서 사용하는 기호와는 다르다는 점을 주의해야 한다. 수학에서는 ' = '이 '같다' 라는 의미를 가지고 있지만 프로그래밍 언어에서는 '변수에 값을 대입을 한다.' 라는 의미로 사용한다. 따라서 프로그래밍 언어에서 '같다' 라는 관계 연산자를 사용하고자 하면 '=='를 사용해야 한다.



관계 연산자는 숫자 값들에서만 사용할 수 있는 것이 아닌 String에서도 사용이 가능하다. 그 이유는 컴퓨터에서는 String을 표현하기 위해서 Ascii 코드를 사용하기 때문이다. Ascii 코드는 문자열이나 특수문자를 숫자로 변환한 코드로 미리 정해져 있다. Ascii 코드표는 구글에서 검색을 한다면 쉽게 얻을 수 있다.


If Statement(조건문)

if 절은 다음과 같이 구성되어 있다.

if <<condition>>:
contents

condition의 내용이 True 이면 contents의 내용을 수행하고 False이면 contents 내용을 수행하지 않고 넘어간다.
if에 속해있는 내용이라는 점을 구별하기 위해서 들여쓰기(indentation)를 사용한다. Python에서는 이 들여쓰기는 스페이스바 4번 혹은 tab키 1번으로 통일하여 사용하는데 자신이 편한 방향으로 통일하여 사용하면 된다. 같은 if 절에 속하는 내용이면 모든 content에 들여쓰기를 사용해야 하며 들여쓰기가 끝나는 지점부터는 if절에 속하지 않는 부분으로 판단하게 된다.
다음은 조건문을 사용한 간단한 예시이다.

input() 함수는 사용자가 직접 변수값을 입력하도록 하는 함수이다. 반환값은 항상 string이다. ()안에 다음과 같이 글귀를 넣으면 다음과 같이 글귀를 print 하면서 변수값을 받을 수 있다.


조건문에는 if 이외에도 else와 elif가 존재한다.


else는 해석 그대로 나머지를 뜻한다. if 절에서 if에 있는 조건문 이외의 모든 부분들을 수행한다. 다음과 같은 예시에서는 13세 이상 65세 미만의 경우에는 if절에 해당하는 조건이지만 그 외에의 나이 즉 13세 미만 65세 이상의 나이들은 else 절에 들어가게 된다.



하지만 어떤 경우에는 같은 변수에 대해서 여러 개의 조건을 취하고 싶은 경우도 있을 것이다. 그럴 경우 if를 여러 개 사용하여 조건문을 만들어도 상관이 없지만 다음과 같이 elif를 사용하면 간단하게 줄일 수 있다. elif란 else if 의 줄임말으로 if에 해당하지 않는 조건 중에 추가 조건을 걸어주는 것이다. 다음과 같이 elif를 사용하면 elif에 해당하는 조건으로 들어가게 된다.



else나 elif는 생략해도 무관하기 때문에 작성하지 않아도 괜찮지만 if절은 사용하면 무조건 contents에 하나의 코드라도 작성을 해야한다


만약 일부 조건에 대해서 아무런 조치를 취하지 않고 싶을 경우에는 pass 라는 사용하면 된다. pass는 말 그대로 코드를 실행하지 않고 넘긴다는 뜻이다.


+ Recent posts