[기초-1차원배열] 이상한 출석 번호 부르기2(설명)

 

정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다.

학생들의 얼굴과 이름을 빨리 익히기 위해 번호를 무작위(랜덤)으로 부르는데,
영일이는 선생님이 부른 번호들을 기억하고 있다가 거꾸로 불러보는 것을 해보고 싶어졌다.

출석 번호를 n번 무작위로 불렀을 때, 부른 번호를 거꾸로 출력해 보자.


참고
배열에 순서대로 기록해 두고, 기록된 내용을 거꾸로 출력하면 된다.

 

입력

번호를 부른 횟수(n, 1 ~ 10000)가 첫 줄에 입력된다.
n개의 랜덤 번호(k, 1 ~ 23)가 두 번째 줄에 공백을 사이에 두고 순서대로 입력된다.

출력

출석을 부른 번호 순서를 바꾸어 공백을 두고 출력한다.


입력 예시

10

10 4 2 3 6 6 7 9 8 5

 

출력 예시

5 8 9 7 6 6 3 2 4 10

 

 

풀이

 

count = int(input())
attend_number = list(map(int, input().split()))
attend_number.reverse()

for number in attend_number:
    print(number, end = " ")

 

설명

앞의 문제를 거꾸로 프린트 해주기만 하면 된다.

'Algorithms > Code Up 100제' 카테고리의 다른 글

Code Up 기초 100제 - 1096  (0) 2020.01.14
Code Up 기초 100제 - 1095  (0) 2020.01.14
Code Up 기초 100제 - 1093  (0) 2020.01.14
Code Up 기초 100제 - 1092  (0) 2020.01.13
Code Up 기초 100제 - 1091  (0) 2020.01.13

[기초-1차원배열] 이상한 출석 번호 부르기1(설명)

 

정보 선생님은 수업을 시작하기 전에 이상한 출석을 부른다.

선생님은 출석부를 보고 번호를 부르는데,
학생들의 얼굴과 이름을 빨리 익히기 위해 번호를 무작위(랜덤)으로 부른다.

그리고 얼굴과 이름이 잘 기억되지 않는 학생들은 번호를 여러 번 불러
이름과 얼굴을 빨리 익히려고 하는 것이다.

출석 번호를 n번 무작위로 불렀을 때, 각 번호(1 ~ 23)가 불린 횟수를 각각 출력해보자.


참고
각 번호가 불린 횟수를 기록하고 출력하기 위해 변수 23개를 선언할 수도 있다.
하지만 C언어에서는 같은 이름에 번호를 붙여 사용하는 배열(array)을 사용할 수 있다.
이는 마치 아파트의 동 호수(예를 들어 a동 101호)와 같이 번호를 붙여 집을 구분하는 것과
비슷하다.

예를 들어 a동 101호를 다르게 표현하면 a[101] 과 같은 표현이 가능한 것이다.
이렇게 번호를 붙여 데이터를 저장할 수 있는 변수인 배열을 사용하기 위해서는
변수처럼, 사용하기 전에 선언해주어야 하는데 아래와 같은 방법으로 가능하다.

 

 

입력

첫 번째 줄에 출석 번호를 부른 횟수인 정수 n이 입력된다. (1 ~ 10000)
두 번째 줄에는 무작위로 부른 n개의 번호(1 ~ 23)가 공백을 두고 순서대로 입력된다.

출력

1번부터 번호가 불린 횟수를 순서대로 공백으로 구분하여 한 줄로 출력한다.

입력 예시

10

1 3 2 2 5 6 7 4 5 9

 

출력 예시

1 2 1 1 2 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0

 

 

풀이

 

count = int(input())
attend_number = list(map(int, input().split()))
call_count = [0 for i in range(23)]

for number in attend_number:
    call_count[(number-1)] += 1
    
for count in call_count:
    print(count, end = " ")

 

설명

출석을 부르는 총 횟수를 저장할 변수를 count로 명명하였다.

출석을 부른 번호를 리스트형태로 저장해주었고,

리스트 안에 있는 번호를 for문을 활용하여 하나씩 꺼내어 해당 번호의 -1 번째의 위치에 1씩 더해주었다.

리스트의 순서는 0번째부터이기 때문이다.

출력 조건에 맞게 리스트의 요소들을 띄어쓰기로 구분하여 출력했다.

 

'Algorithms > Code Up 100제' 카테고리의 다른 글

Code Up 기초 100제 - 1095  (0) 2020.01.14
Code Up 기초 100제 - 1094  (0) 2020.01.14
Code Up 기초 100제 - 1092  (0) 2020.01.13
Code Up 기초 100제 - 1091  (0) 2020.01.13
Code Up 기초 100제 - 1090  (0) 2020.01.13

[기초-종합] 함께 문제 푸는 날(설명)

 

온라인 채점시스템에는 초등학생, 중고등학생, 대학생, 대학원생,
일반인, 군인, 프로그래머, 탑코더 등 아주 많은 사람들이 들어와 문제를 풀고 있는데,

실시간 채점 정보는 메뉴의 채점기록(Judge Status)을 통해 살펴볼 수 있다.

자! 여기서...잠깐..
같은 날 동시에 가입한 3명의 사람들이 온라인 채점시스템에 들어와 문제를 푸는 날짜가
매우 규칙적이라고 할 때, 다시 모두 함께 문제를 풀게 되는 그날은 언제일까?

예를 들어 3명이 같은 날 가입/등업하고, 각각 3일마다, 7일마다, 9일마다
한 번씩 들어온다면, 처음 가입하고 63일 만에 다시 3명이 함께 문제를 풀게 된다.


갑자기 힌트?

왠지 어려워 보이지 않는가?

수학에서 배운 최소공배수를 생각한 사람들도 있을 것이다. 하지만, 정보에서 배우고 경험하는
정보과학의 세상은 때때로 컴퓨터의 힘을 빌려 간단한 방법으로 해결할 수 있게 한다.

아래의 코드를 읽고 이해한 후 도전해 보자.

day는 날 수, a/b/c는 방문 주기이다.
...
day=1;
while(day%a!=0 || day%b!=0 || day%c!=0) day++; //이게 무슨 의미일까?
printf("%d", day);
...

물론, 아주 많은 다양한 방법이 있을 수 있다.

정보과학의 문제해결에 있어서 정답은?
하나가 아니라 주어진 시간/기억공간으로 정확한 결과를 얻을 수 있는 모든 방법이다.

따라서, 모든 문제들에는 정답이 하나뿐만이 아니다.

새로운, 더 빠른, 더 간단한 방법을 다양하게 생각해보고 도전해 볼 수 있다.

입력

같은 날 동시에 가입한 인원 3명이 규칙적으로 방문하는,
방문 주기가 공백을 두고 입력된다. (단, 입력값은 100이하의 자연수이다.)

출력

3명이 다시 모두 함께 방문해 문제를 풀어보는 날(동시 가입/등업 후 며칠 후?)을 출력한다.

입력 예시

3 7 9

 

출력 예시

63

 

풀이

 

days = list(map(int, input().split()))

def gcdi(a, b):

    while (b != 0):
    
        if (a > b):
            a, b = b, (a % b)
            
        else:
            a, b = a, (b % a)
            
    return a

def lcmu(a, b):
    
    return a * b // gcdi(a, b)

def multi_lcmu(list):
    
    while(len(list) != 1):
        list.append(lcmu(list.pop(), list.pop()))
        
    print(list.pop())
                    
multi_lcmu(days)

 

설명

 

여러 숫자의 최소공배수 구하는 코드를 직접 짜보았습니다.

시행 착오가 많아서 https://brownbears.tistory.com/454 님의 코드를 많이 참고하였습니다.

한번에 모든 수의 최소공배수를 구하는 것이 아닌 2개의 숫자씩 뽑아서 구하는 방식입니다.

 

최대공약수를 구하는 방식은 유클리드 호제법을 참고하였습니다.

 

 

풀이 2

 

day1, day2, day3 = map(int, input().split())

day = 1

while((day % day1 != 0) or (day % day2 != 0) or (day % day3 != 0)):
    day += 1
    
print(day)

 

설명

 

위의 문제에서 말하는 아주 다양한 방법 중 하나 이다.

or을 쓰게 되면 둘 중 하나가 True일 경우 True를 반환한다. 위 경우는 3개이기 때문에 셋 중 하나가 True이면 True를 반환한다.

세 개의 조건이 전부 False일 경우 False를 반환하게 되고 while을 빠져나오는 방식이고 day에 계속 1을 더해준 최종 값을 반환한다.

 

day % day1 != 0을 False로 만들기 위해서는 day값이 day1에 나누어 떨어져야 한다.

그렇게 되면 day % day1은 0이 나오게 되고

0 != 0 조건은 틀리게 되어 False를 반환하게 된다.

 

결국 각 모든 조건에서 False를 반환하기 위해서는 day1, day2, day3에 모두 나누어 떨어지는 숫자가 들어가게 되고

1부터 1씩 더하여 조건을 비교하므로 최솟값이 들어가게 되며 결국 day는 day1, day2, day3의 최소 공배수가 된다.

'Algorithms > Code Up 100제' 카테고리의 다른 글

Code Up 기초 100제 - 1094  (0) 2020.01.14
Code Up 기초 100제 - 1093  (0) 2020.01.14
Code Up 기초 100제 - 1091  (0) 2020.01.13
Code Up 기초 100제 - 1090  (0) 2020.01.13
Code Up 기초 100제 - 1089  (0) 2020.01.13