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


정보 선생님은 오늘도 이상한 출석을 부른다.

영일이는 오늘도 다른 생각을 해보았다.
출석 번호를 다 부르지는 않은 것 같은데... 가장 빠른 번호가 뭐였지?

출석 번호를 n번 무작위로 불렀을 때, 가장 빠른 번호를 출력해 보자.


참고
배열에 순서대로 기록해 두면, 기록된 내용을 모두 검사해 가장 작은 값을 찾아내면 된다.

그런데, 가장 작은 값은 어떻게 어떤 것과 비교하고 찾아야 할까?

 

정답

a=input()
a=int(a)
b=input().split(' ')
c=int(b[0])

for i in range(a):
    if int(b[i]) < c:
        c=int(b[i])

print(c)

 

모범 소스

a=input()
b=input().split()
 
n=int(a)
arr=[]
for i in range(n) :
    arr.append(int(b[i]))
 
m=23
for i in range(n) :
    if m>arr[i] :
        m=arr[i]

print(m)

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

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


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

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

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


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

예시
int n, i;
int a[1000]={};
scanf("%d", &n); //개수 입력 받기
for(i=1; i<=n; i++) //개수 만큼 입력 받기
scanf("%d", &a[i]); //읽어서 순서대로 배열에 넣는다.

for(i=n; i>=1; i--)
printf("%d ", a[i]); //i 번 배열에 저장되어 있는 값 출력하기

 

정답

a=input()
a=int(a)
b=input().split(' ')

for i in range(a-1,-1,-1):
    print(b[i],end=' ')

 

모범 소스

arr=[]
 
a=input()
b=input().split()
 
n=int(a)
for i in range(n) :
    arr.append(int(b[i]))
 
i=n-1
while i>=0 :
    print(arr[i], end=' ')
    i-=1

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

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


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

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

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

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


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

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

예시
int a[100]; //a[0] ~ a[99] 까지 정수를 저장할 수 있는 배열을 만들어라.
for(i=0; i<100; i++)
{
scanf("%d", &a[i]); // 각각의 방에 순서대로 반복하면서 값을 입력해라.
}

배열을 사용하기 전에 배열에 들어있는 값을 초기화시키는 것이 좋은데,
다음과 같은 여러 가지 방법이 있다.

int a[24]={}; //0번부터 23번까지 모두 0으로 초기화된다.
int a[24]={1,2,3}; //1,2,3 이 순서대로 들어가고 나머지는 모두 0으로 초기화된다.
int a[3]={1,2,3}; //1,2,3 이 순서대로 저장된다.
int a[3]={1,2,3,4}; //방을 3개 만들고 값을 4개를 집어넣어라? 오류 발생!


문제 해결을 위한 참고 코드

int n, i, t;
int a[24]={};
scanf("%d", &n); //개수 입력받기
for(i=1; i<=n; i++) //개수만큼 입력받기
{
scanf("%d", &t); //읽어서
a[t]=a[t]+1; //들어있던 값에 1만큼 더해 다시 저장. a[t]+=1 과 같다.
}
for(i=1; i<=23; i++)
{
printf("%d ", a[i]); //1~23 번 배열에 저장되어있는 값 출력하기
}

 

정답

a=input()
a=int(a)
b=input().split(' ')
c=[0]*24

for i in range(a): 
    for j in range(1,len(c)):
        
        if int(b[i]) == j:
            c[j]= c[j]+1

for k in range(1,len(c)):
    print(c[k],end=' ')

 

모범 소스

a=input()
b=input().split()

n=int(a)
arr=[]
for i in range(24) :
    arr.append(0)
for i in range(n) :
    arr[int(b[i])]+=1    
    
for i in range(1, 24) :
    print(arr[i], end=' ')

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

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


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

실시간 채점 정보는 메뉴의 채점기록(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);
...

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

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

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

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

 

정답

a,b,c=input().split(' ')
a=int(a)
b=int(b)
c=int(c)
day=1

while day % a !=0 or day % b !=0 or day % c !=0:
    day=day+1

print(day)

 

 


CodeUp 기초 100제 : https://codeup.kr/problemsetsol.php?psid=23

 논리연산자

 

논리연산자의 종류입니다.

 

연산자 의미
a and b a와 b가 True인 경우 True
a or b a와 b중 한 개 이상이 True인 경우 True
not a a의 논리 값을 반대로

논리 연산자의 판단 결과는 True, False를 이용해 나타냅니다.

 

and, or, not 연산자가 하나의 식에 있으면 not, and, or 순으로 판단합니다.

 

a True True False False
b True False True False
a and b True False False False
a or b True True True False
not a False False True True
not b False True False True

 

a와 b에 따른 경우의 수입니다.

 

a=5 > 2
b=2 < 3

# 결과>>True
print(a and b)

# 결과>>True
print(a or b)

# 결과>>False
print(not a)

 비교연산자

 

비교연산자의 종류입니다.

 

연산자 의미
a > b a가 b보다 크면 True
a >= b a가 b보다 크거나 같으면 True
a < b a가 b보다 작으면 True
a <= b a가 b보다 작거나 같으면 True
a == b a와 b가 같으면 True
a != b a와 b가 다르면 True
a is b a와 b가 같은 객체이면 True
a is not b a와 b가 다른 객체이면 True (is의 반대)

 

비교 연산자의 판단 결과는 True, False를 이용해 나타냅니다.

 

a=5
b=2

# 결과>>True
print(a > b)

# 결과>>True
print(a >= b)

# 결과>>False
print(a < b)

# 결과>>False
print(a <= b)

 

a=5
b=2
c=2.0
d='Test'
e='test'

# 결과>>False
print(a == b)

# 결과>>True
print(a != b)

print(type(b)) # 결과>><class 'int'>
print(type(c)) # 결과>><class 'float'>

# 결과>>True
print(b == c)

# 결과>>False
print(d == e)

# 결과>>True
print(d != e)

==와 !=은 객체의 값을 비교합니다.

 

객체의 type이 다르면 두 객체는 다른 것입니다.
하지만 숫자형인 경우 같은 숫자라면 모두 같은 숫자로 판별됩니다.

 

b가 int형으로 2이고 c가 float형으로 2.0이지만 ==을 통해 비교했을 때 True인 것을 통해 알 수 있습니다.

 

문자열은 비교할 때 단어가 같아도 대소문자가 다르면 다른 문자열로 판단합니다.

 

d가 Test이고 e가 test인데 ==을 통해 비교했을 때 False인 것을 통해 알 수 있습니다.

 

b=2
c=2.0
d=2.0

print(type(b)) # 결과>><class 'int'>
print(type(c)) # 결과>><class 'float'>
print(type(d)) # 결과>><class 'float'>

print(id(b)) # 결과>>1430701776
print(id(c)) # 결과>>1799145593160
print(id(d)) # 결과>>1799145593160

# 결과>>False
print(b is c)

# 결과>>True
print(b is not c)

# 결과>>True
print(c is d)

is와 is not은 객체를 비교합니다.

 

객체를 비교하는 것은 id() 함수를 통해 할 수 있습니다.
id() 함수는 객체 고유 값(메모리 주소)을 알려주는데 이는 실행시마다 바뀝니다.

 

b가 2이고 c가 2.0인데 is를 통해 비교했을 때 False인 것을 통해 알 수 있습니다.

id() 함수의 값이 다르고 b는 정수 객체이고 c는 실수 객체여서 다른 객체이기 때문입니다.

 

 

c는 2.0이고 d도 2.0인데 id() 함수를 통한 값을 보면 서로 같은 것을 알 수 있습니다.

또한 is를 통해 비교했을 때 True인 것을 알 수 있습니다.

 

+ Recent posts