본문 바로가기
내가 공부하려고 올리는/알고리즘

[코드업] 기초 100 - Python(파이썬) 리뷰

by 결딴력 2022. 4. 20.
반응형

파이썬 문법을 처음 공부하고 코드업에서 풀었던 기초 100을 리뷰해보고자 한다.

 

 

쉬운 문제와 어려운 문제, 맞은 문제 틀린 문제 할 것 없이

 

내가 리뷰하고 싶다고 생각했던 몇 문제들만 리뷰해보려고 한다!

 

그럼 스타또 -!

 

 

[6018]

24시간 시:분 형식으로 시간이 입력될 때, 그대로 출력하는 연습을 해보자.

 

[풀이]

a, b = input().split(':')
print(a, b, sep=':')

 

[리뷰]

파이썬 문법을 공부하면서 가끔 자바와 달라서 낯설게 느껴지는 문법들이 있다.
여기선 input().split()이였는데, split 안에 나누는 기준이 되는 문자열을 입력하면
그 문자열을 이용해 나눌 수 있다는 것,
또 입력된 문자열을 sep=''을 사용하여 출력 형식을 지정할 수 있다는 것이 흥미로웠다.

 

 

[6030]

영문자 1개를 입력받아 10진수 유니코드(Unicode) 값으로 출력해보자.

 

[풀이]

n=input()
n=ord(n)
print(n)

 

[리뷰]

여기서는 ord() 함수를 사용하면 입력받은 문자열에 해당하는 유니코드 정수를 반환한다는 것을
처음 알게 됐다.

 

 

 

[6031]

10진 정수 1개를 입력받아 유니코드 문자로 출력해보자.

 

[풀이]

c=input()
c=int(c)
print(chr(c))

 

[리뷰]

6030번 문제와 비슷한데, 여기서는 chr() 함수를 사용하게 되면,
입력받은 정수에 해당하는 유니코드 문자를 돌려준다는 것을 처음 알게 됐다.

 

 

 

[6043]

실수 2개(f1, f2)를 입력받아
f1을 f2로 나눈 값을 출력해보자. 이때 소수점 넷째자리에서 반올림하여
무조건 소숫점 셋째 자리까지 출력한다.

 

[풀이]

답안
a,b=input().split()

a=float(a)
b=float(b)
c=a/b

print('%.3f'%c)

내 답안
a, b = input().split()
c = float(a) / float(b)
print("{:.3f}".format(c))

 

 

[리뷰]

소수점을 표현하는 데 있어서 파이썬은 표현법이 여러 개 있는 것 같다.
나는 아래 표현 식을 사용했는데 내 답안이 수행 시간이 짧고 메모리를 덜 먹는 것 같아서
앞으로 소수점을 표현해야 할 때는 내 답안으로 가는 것이 좋을 것 같단 생각을 했다.

 

 

 

[6052]

정수가 입력되었을 때, True/False로 평가해주는 프로그램을 작성해보자.

 

[풀이]

a = int(input())
print(bool(a))

 

[리뷰]

파이썬에서 boolean 타입에 대한 문법을 처음 확인하게 돼서 리뷰하게 된 문제

 

 

[6059]

입력된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자.

 

[풀이]

a=int(input())
print(~a)

 

[리뷰]

비트 단위 연산이란 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자이다.
또한, 왼쪽이나 오른쪽으로 전체 비트를 이동시킬 때에도 사용한다.
비트 단위 연산자라는 말은 알고 있었는데
막상 문제로 맞닥뜨리게 되니까 굉장히 낯설었다.

비트 연산자 - 출처 : TCP School

 

 

 

 

[6063]

입력된 두 정수(a, b) 중 큰 값을 출력하는 프로그램을 작성해보자.
단, 3항 연산을 사용한다.

 

[풀이]


답안
a, b = input().split()
a = int(a)
b = int(b)
c = a if a>=b else b
print(c)

내 답안
a, b = map(int, input().split())
print(a if a >= b else b)

 

[리뷰]

삼항 연산도 낯설었지만
여러 개의 정수를 받을 경우 일일이 int()로 type converting 하는 것이 귀찮았는데
map(int, input().split())과 같은 형식으로 여러 개의 정수를 한 번에 타입 변환할 수 있다는 것을 알게 됐다.

 

 

[6066]

3개의 정수(a, b, c)가 입력되었을 때, 짝(even)/홀(odd)을 출력해보자.

 

[풀이]

답안
a,b,c=input().split()
a=int(a)
b=int(b)
c=int(c)

if a%2==0:
  print("even")
else:
  print("odd") 

if b%2==0: 
  print("even")
else:
  print("odd")

if c%2==0:
  print("even")
else:
  print("odd") 

내 답안
a, b, c = map(int, input().split())

def evenOdd(int) :
   if int % 2 == 0 :
    print("even")
  else :
    print("odd")

evenOdd(a)
evenOdd(b)
evenOdd(c)

 

[리뷰]

파이썬 문법을 공부했을 때, 본인이 정의한 함수를 사용하는 법을 배웠는데
이 문제에서 그 방식을 사용할 수 있겠다는 생각이 들었다.
예시 답안처럼 이번 문제는 각 정수에 동일한 로직을 적용해야 하기 때문에
적용해야 하는 로직을 함수로 정의해 실행해봤다.

실행 결과 문제없이 동작했고 예시 답안보다 메모리나 실행 속도 측면에서 효율적이어서 만족스러웠다.

 

 

 

[6070]

월이 입력될 때 계절 이름이 출력되도록 해보자.

 

[풀이]

답안
a=int(input())
if a//3==1:
    print("spring")
elif a//3==2:
    print("summer")
elif a//3==3:
    print("fall")
else:
    print("winter")

내 답안
a = int(input())
if a == 12 or a == 1 or a == 2 :
  print("winter")
elif a == 3 or a == 4 or a == 5 :
  print("spring")
elif a == 6 or a == 7 or a == 8 :
  print("summer")
else :
  print("fall")

 

[리뷰]

사실 실행 속도나 메모리 효율 측면에서는 내 답안이 더 좋은 답안인 것 같으나
반복적인 작업을 줄이는 것이 또 개발자의 숙명이기 때문에
몫을 통해 계절을 나누는 것이 상당히 띠용(?) 스러웠다.
한 번도 이런 생각을 못해본 것 같다..

 

 

 

[6071]

0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자.

 

[풀이]

답안
while True:
    a=input()
    a=int(a)
    if a==0:
        break
    else:
        print(a)

내 답안
n = 1
while n != 0 :
  n = int(input())
  if n != 0 :
    print(n)

 

 

[리뷰]

while 자체에 조건을 부여하는 것만 생각했는데,
그냥 while문에 True를 부여하고 break문으로 빠져나오는 것까지 생각을 못해서
그 부분을 리뷰하고 싶어서 포함한 문제이다.

이후에 while True를 많이 사용해 봤는데
break문을 잘 못 입력하는 경우
무한 반복문이 되는 경우가 많으니
주의해서 사용해야 될 것 같다.

 

 

 

[6074]

영문 소문자(a ~ z) 1개가 입력되었을 때,
a부터 그 문자까지의 알파벳을 순서대로 출력해보자.

 

[풀이]

a = ord(input())
b = ord("a")
while a >= b :
  print(chr(b), end=' ')
  b = b+1

 

 

[리뷰]

일반적으로 자바로 웹 프로그래밍을 할 때는 영문자를 정수로 반환하고,
그 정수에 수를 더해 그다음 알파벳을 출력하는 로직을 경험할 일이 없어서
처음에 이러한 로직 자체도 굉장히 낯설었다.

우선 핵심적으로는 입력된 문자를 ord()로 해당 유니코드에 맞는 정수를 반환한다는 것,
그리고 그 정수에 1을 더한 값에 해당하는 정수에 맞는 유니코드 문자를 chr() 함수를 이용해
다시 출력한다는 점이다.

또한 여기서 end=' ' 문법에 대해 알게 되었는데,
반복문을 통해 어떤 문자나 정수를 출력할 때,
줄 바꿈을 하지 않고 띄어쓰기로 출력하고 싶은 경우
end=' '을 사용하면 된다는 것을 알게 됐다.

 

 

 

[6076]

정수(0 ~ 100) 1개를 입력받아 0부터 그 수까지 순서대로 출력해보자.

 

[풀이]

a = int(input())
for i in range (a+1) :
  print(i)

 

[리뷰]

for문에 대해 리뷰하고 싶어서 선택한 문제이다.
우선 for문의 기본 구조는
for item in iterable : 로 iterable에는 list와 set 같은 자료형이 있다.

만약 반복하고자 하는 범위가 iterable하지 않고
위의 문제와 같이 정수형인 경우 in range() 문법을 통해 해결할 수 있다.

in range(a, b)의 형태로 사용되는데,
a는 시작 인덱스로 생략할 수 있고, 생략할 경우 기본적으로 0부터 시작한다.
b는 종료 인덱스로 출력을 원하는 범위의 +1을 더한 값을 사용한다.

 

 

[6081]

16진수(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)를 배운
영일이는 16진수끼리 곱하는 16진수 구구단? 에 대해서 궁금해졌다.

A, B, C, D, E, F 중 하나가 입력될 때,
1부터 F까지 곱한 16진수 구구단의 내용을 출력해보자.
(단, A ~ F 까지만 입력된다.)

 

[풀이]

a = int(input(), 16) 
for i in range(1, 16): 
  print("%X*%X=%X" % (a, i, a*i))

 

[리뷰]

자바를 사용할 때도 표현식을 잘 사용하지 않기 때문에
해당 진수에 맞는 표현식을 사용하는 것이 굉장히 낯설다.

파이썬에서 입력받은 변수를 10진수로 변환할 때는
input() 함수 뒤에 입력한 변수의 타입에 맞는 진수를 사용한다.

또한 해당 10진수를 다시 다른 진수로 변환할 때는
%O(8진수), %X(16진수)와 같은 표현식을 이용해 표현하고
해당 진수에 들어갈 변수는 % 이후에 변수명을 입력하는 식으로 사용한다.

이 문제를 내장 함수인 bin(), oct() 등을 이용해 풀어보려고 했는데
이 내장 함수는 반환형이 string() 타입이라 문제에 맞지 않았다.

 

 

 

 

[6082]

친구들과 함께 3 6 9 게임을 하던 영일이는 잦은 실수 때문에 계속해서 벌칙을 받게 되었다.
3 6 9 게임의 왕이 되기 위한 369 마스터 프로그램을 작성해 보자.

 

[풀이]

a= int(input())
for i in range(1, a+1) :
  if i%10==3 or i%10==6 or i%10==9 :
    print('X', end=' ')
  else :
    print(i, end=' ')

 

[리뷰]

해당 문제는 처음에 오답을 입력했던 부분이 생각나서 리뷰하는 문제이다.
3, 6, 9는 해당 숫자가 들어가면 박수를 치는 게임으로,
3의 배수에서 박수를 치는 게임이 아닌데
나도 모르게 문제를 3의 배수면 박수를 치는 식으로 풀어서 오답을 제출했었다.

해당 1의 자리를 포함하는지를 알고 싶은 경우
위의 풀이와 같이 10으로 나눈 나머지 값을 확인하면 된다.

위의 경우 10의 자리로 문제가 한정되어 있었기 때문에 가능한 풀이이고
100의 자리를 넘길 경우 다른 로직이 필요할 것 같다.
ex) 100으로 나눈 나머지를 10으로 다시 나눠서 1의 자리 숫자 확인하기

 

 

 

[6083]

빨강(red), 초록(green), 파랑(blue) 빛을 섞어 여러 가지 다른 색 빛을 만들어 내려고 한다.

빨강(r), 초록(g), 파랑(b) 각 빛의 가짓수가 주어질 때,
주어진 rgb 빛들을 섞어 만들 수 있는 모든 경우의 조합(r g b)과 만들 수 있는 색의 가짓수를 계산해보자. 

 

[풀이]

r, g, b = map(int, input().split()) 
for i in range(0, r): 
  for j in range(0, g): 
    for k in range(0, b): 
      print(i, j, k) 
print(r*g*b)

 

[리뷰]

풀이가 어려웠던 것이 아니라 기초 수학도 까먹어버린 내 뇌가 문제였다..
빨강, 초록, 파랑이 각각 가짓수가 주어질 때 만들 수 있는 색의 가짓수를 어떻게 계산하는지를 몰랐다.. ㅎ;ㅎ

해당 경우의 수는 '곱의 법칙'으로 간단히 다 곱하기만 하면 된다..
나름 예전에 모의고사로 수학 1등급도 찍었었는데.. 진짜 다 까먹었다..ㅜㅜ
알고리즘 하다 보면 순열이나 조합은 저절로 공부하게 될 듯하다..

어쨌든 해당 조합을 모두 출력하기 위해
for문을 중첩으로 사용했다는 것도 확인해두자!

 

 

 

[6086]

1, 2, 3 ... 을 순서대로 계속 더해 합을 만드는데,
그 합이 입력한 정수보다 작을 동안만 계속 더하는 프로그램을 작성해보자.

즉, 1부터 n까지 정수를 하나씩 더해 합을 만드는데,
어디까지 더해야 입력한 수보다 같거나 커지는지 알아보고자 하는 문제이다.

하지만, 이번에는 그때까지의 합을 출력해야 한다.

 

[풀이]

답안
a=int(input())
s=0
c=0

while True:
    s=s+c
    c=c+1
    if s>=a:
        break
    print(s)

내 답안
a = int(input())
while True :
  b = 0
  for i in range(1, a+1) :
    b += i
    if b >= a :
      print(b)
      break
  break

 

 

[리뷰]

while True : 로 반복문을 돌린 것은 모범 답안과 동일하나
나는 for문으로 반복문을 한 번 더 사용했다.

이렇게 사용한 이유는 해당 범위 내에서
변수 i를 1씩 증가시키는 로직을 짜기 위해서였는데

모범 답안을 보고 나니 생각해보니 굳이 for문을 사용할 이유가 없었다.
묘상하게도 내 답이 수행 시간이 더 짧고, 메모리를 덜 먹었지만
반복문을 중첩으로 사용하는 것보다는
한 번만 사용하는 것이 더 좋은 알고리즘일 것 같다는 생각이 들었다.

 

 

 

[6088]

어떤 규칙에 따라 수를 순서대로 나열한 것을 수열(sequences)이라고 한다.

예를 들어
1 4 7 10 13 16 19 22 25 ... 은
1부터 시작해 이전에 만든 수에 3을 더해 다음 수를 만든 수열이다.
이러한 것을 수학에서는 앞뒤 수들의 차이가 같다고 하여

등차(차이가 같다의 한문 말) 수열이라고 한다. (등차수열 : arithmetic progression/sequence)
수열을 알게 된 영일이는 갑자기 궁금해졌다.

"그럼.... 123번째 나오는 수는 뭘까?"

영일이는 프로그램을 만들어 더 큰 수도 자동으로 계산하고 싶어졌다.

시작 값(a), 등차(d), 몇 번째인지를 나타내는 정수(n)가 입력될 때
n번째 수를 출력하는 프로그램을 만들어보자.

 

[풀이]

답안
a,d,n=input().split()

a=int(a)
d=int(d)
n=int(n)

s=a
for i in range(2, n+1):
   s+=d

print(s)

내 답안
a, d, n = map(int, input().split())
print(a+d*(n-1))

 

 

[리뷰]

등차수열에 관한 문제였다.
사실 내 답안이 내 답안이 아니고
예시 답안이 오히려 내 답안에 가깝다.

'일정한 증가 값이 있고 반복을 돌려야 해? 그럼 반복문을 써야지!'
라고 생각이 들어서 for문으로 돌렸는데

알고 보니 반복문을 돌릴 필요가 없었다.
등차수열을 모두 출력해야 한다면 예시 답안처럼 사용하는 것이 맞겠지만,

문제에서는 모든 등차 수열이 아니 해당 순번의 값을 요구하고 있기 때문에
반복문을 사용하지 않아도 된다.

이때 구하고자 하는 자리 수에 -1을 해야 한다는 것에 주의하자.

 

 

 

 

[6091]

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

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

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

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

 

[풀이]

a, b, c = map(int, input().split())

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

print(d)

 

[리뷰]

이 문제는 사실 못 풀었는데 예시 답안의 풀이가 신선하다는 생각이 들었다.

사실 며칠마다 어쩌고저쩌고 문제라서 최소 공배수를 처음에 생각했는데
풀이에서는 정수를 1부터 반복하는 반복문에서 각 반복 일수를 나눈 나머지 값이
모두 0일 때 반복문을 종료하는 식으로 문제 해결 법을 제시했다.

같은 최소 공배수 개념이지만 풀이가 훨씬 깔끔하고 신선하다는 생각을 했다.

 

 

 

 

[6092]

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

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

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

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

 

[풀이]

n = int(input())
a = input().split()

for i in range(n) :
  a[i] = int(a[i])

d = []
for i in range(24) :
  d.append(0)

for i in range(n) :
  d[a[i]] += 1

for i in range(1, 24) :
  print(d[i], end = ' ')

 

[리뷰]

개인적으로 90번 대에 들어오면서 알고리즘 맛보기가 시작되는 느낌이었다.
우선 문제의 핵심은 1~23까지의 번호를 랜덤으로 n번 부르고
1~23번까지 각각 몇 번 불렸는지 화면에 출력하는 것이다.

이를 위해서는 일단 불릴 횟수(n)를 선언하고
각각 불러지는 번호를 입력받아야 한다.(a)

입력받은 번호는 배열로 저장해 두고
총 23번까지 있기 때문에 23번까지 표시할 수 있는 배열을 선언한다.

이후 입력받은 출석 선언 횟수만큼 
d[a[i]] += 1 반복문을 돌리게 되면
불린 번호의 횟수만큼 count가 가능해진다.

배열을 여러 개 선언해서 복잡해 보이지만
알고 보면 단순한 문제이긴 한디..

나중에 이런 형태를 응용해서 쉽게 쉽게 풀어나갈 수 있을지가 조금 걱정이 된다..ㅜ

 

 

 

[6093]

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

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

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

 

[풀이]

n = int(input())
a = input().split()

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

 

[리뷰]

이것도 풀이 방법을 몰랐다.

range함수를 이용하면 간단하게 풀 수 있는데
range함수는 기본적으로 (시작 인덱스, 종료 인덱스, 증감 값)으로 구성된다.
따라서 시작 인덱스를 번호를 부른 번호-1부터 시작해서
0번째 인덱스까지 출력하기 위해 -1까지 종료 인덱스를 설정하고
증감 값을 -1을 선언하면 선언한 숫자를 거꾸로 출력할 수 있다.

 

 

 

[6095]

기숙사 생활을 하는 학교에서 어떤 금요일(전원 귀가일)에는 모두 집으로 귀가를 한다.

오랜만에 집에 간 영일이는 아버지와 함께 두던 매우 큰 오목에 대해서 생각해 보다가
"바둑판에 돌을 올린 것을 프로그래밍할 수 있을까?"하고 생각하였다.

바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때,
n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보자.

 

[풀이]

arr = [[0 for j in range(20)] for i in range(20)]
n = int(input())
for i in range(n) :
  a, b = map(int, input().split())
  arr[a][b] = 1

for i in range(1, 20) :
  for j in range(1, 20) :
    print(arr[i][j], end=' ')
  print()

 

[리뷰]

이런 문제는 2차원 배열을 생성해서 풀어야 하는데
2차원 배열은 arr = [[0 for j in range(20)] for i in range(20)]과 같이
간단하게 생성할 수 있다. 여기서 i는 row를 j는 컬럼을 의미한다.

이후 바둑알을 놓을 횟수만큼 반복문을 돌려
선언한 2차원 배열에 값을 넣어준다.

그리고 중첩 for문을 이용해 배열을 출력하는데
하나의 행이 끝난 뒤에는 줄을 바꿔야 하기 때문에 마지막 문단에 print()를 추가해줘야 한다.

이때 해당 바둑알의 좌표는 1부터 19까지이므로
인덱스를 0부터가 아닌 1부터 시작해서 20까지로 지정해줘야
원하는 값을 출력할 수 있다.

 

 

 

[6096]

부모님을 기다리던 영일이는 검정/흰 색 바둑알을 바둑판에 꽉 채워 깔아 놓고 놀다가...

"십(+)자 뒤집기를 해볼까?"하고 생각했다.

십자 뒤집기는
그 위치에 있는 모든 가로줄 돌의 색을 반대(1->0, 0->1)로 바꾼 후, 
다시 그 위치에 있는 모든 세로줄 돌의 색을 반대로 바꾸는 것이다.
어떤 위치를 골라 집자 뒤집기를 하면, 그 위치를 제외한 가로줄과 세로줄의 색이 모두 반대로 바뀐다.

바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
n개의 좌표를 입력받아 십(+)자 뒤집기 한 결과를 출력하는 프로그램을 작성해보자.

 

[풀이]

arr = [list(map(int, input().split())) for _ in range(19)]
n = int(input())

for i in range(n) :
  x, y = map(int, input().split())
  for j in range(19) :
    if arr[j][y-1] == 0 :
      arr[j][y-1] = 1
    else :
      arr[j][y-1] = 0
    if arr[x-1][j] == 0 :
      arr[x-1][j] = 1
    else :
      arr[x-1][j] = 0

for i in range(len(arr)) :
    for j in range(len(arr[i])) :
      print(arr[i][j], end = ' ')
    print()

 

[리뷰]

우선 부모님을 기다리던 영일이는 대체 왜 이런 게 궁금한지 근본적인 물음이 먼저 떠올랐다..

문제 얘기를 해보자면
2차원 배열을 어떻게 입력받아야 하는지를 몰랐다.
2차원 배열을 입력받는 방법은 인터넷 서칭을 통해 나와 있는 방식을 참고했다.

2차원 배열을 입력받은 후에는
이제 바둑알 개수와 for문을 통해 가로/세로를 1은 0으로, 0은 1로 전환해줘야 하는데

이 과정에서 처음에는 입력받은,
예를 들어 10 10에 좌표는 바꾸지 않는다라는 로직이 필요하지 않나 생각했는데

알고 보니 어차피 동일 자리에 두 번 로직이 적용되기 때문에
제자리로 알아서 돌아가는구나를 깨달았다.

갈 길이 먼 알고리즘 공부..

 

 

 

[6098]

영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.

왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.

개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)

이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.

미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.

미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.

단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더 이상 이동하지 않고 그곳에 머무른다고 가정한다.

미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

 

[풀이]

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

a = 1
b = 1
arr[a][b] = 9

while True :
  if arr[a][b+1] == 0 :
    b += 1
    arr[a][b] = 9
  elif arr[a+1][b] == 0 :
    a += 1
    arr[a][b] = 9
  elif arr[a][b+1] == 2 :
    b += 1
    arr[a][b] = 9
    break
  elif arr[a+1][b] == 2 :
    a += 1 
    arr[a][b] = 9
    break
  else :
    break

for i in range(len(arr)) :
  for j in range(len(arr[i])) :
    print(arr[i][j], end = ' ')
  print()

 

[리뷰]

영일이처럼 수학적 사고를 한다면

진작 서울대는 갔겠다는 생각을 하면서 풀게 된
마지막 문제

예시 답안이 내 답안보다 깔끔한 것 같기는 한데
내 답안도 썩 나쁘진 않다고 생각

마지막 문제를 내 힘으로 풀어서 한 번에 맞춘 것에 박수 👏👏👏

 

 

 

 


이제 막 알고리즘 맛뵈기를 끝낸 상태인 것 같다.

운동하는 것처럼 하고 나면 재밌는데

고민하는 그 순간은 굉장히 짜증이 난다..ㅎㅎ

 

앞으로 갈 길이 멀지만 천리길도 한 걸음부터.. 화이팅..!

 

 

 

반응형

댓글