코딩테스트

코테 대비 루비 문법 공부하기!

seung_ho_choi.s 2025. 1. 23. 20:08
728x90

변수명 선언

# 파이썬과 비슷하게 세미콜론 없습니다.

# 로컬변수 : 소문자로 작성
apple="로컬"

# 인스턴스 변수 : 변수명 앞에 @
@apple="인스턴스"

# 클래스 변수 : 변수명 앞에 @@
# @@apple="클래스"

# 글로벌 변수 : 변수명 앞에 $
$apple="글로벌"

# 상수 : 대문자로 작성
APPLE="상수"


puts @apple
puts $apple
puts apple
puts APPLE

 

주석 처리

# 한 줄 주석처리는 이렇게 합니다. 
=begin 
  Ruby에서는 여러주석은 bigin end를 활용해
  처리를 합니다.
=end

 

입력

# # 기본적인 입력값
name= gets
puts "안녕하세요, #{name}님!"

# # 입력값에서 개행 문자 제거 chomp
name = gets.chomp
puts "안녕하세요, #{name}님!"

# # 정수 입력 실수는 f
age= gets.chomp.to_i
puts "나이:" #{age} 

# puts "숫자 3개를 입력하세요 (공백으로 구분):"
numbers = gets.chomp.split.map(&:to_i)
puts "입력된 숫자: #{numbers.inspect}"

# 여러 공백 1 2 3 이런거 
# 방법 1
a, b, c = gets.chomp.split.map(&:to_i)
# 방법 2
a, b, c = gets.chomp.split
puts a 
puts b

# 문자열 -> 배열
message = gets.chomp.to_s
stack=[]
message.each_char {|element| stack.push(element)}

# 이렇게 바로 해도됨
left_stack=gets.chomp.chars

# 숫자 -> 배열
message = gets.chomp.chars.map(&:to_i)
stack = message.digits.reverse

 

출력

apple="나는 사과"

print apple

puts apple

p "123"
p 123

puts answerHeart.join(" ")
puts answer.join(" ")
# 이렇게 하면 0 0 0 0 0 이렇게 출력됨 참고로 저건 배열 및 리스트

puts [a,b].join(" ")
 puts "#{min} #{max}"
 
 
 # 20개씩 출력 한줄에 
 BUTTON.each_slice(20) { |slice| puts slice.join(" ") }

 

연산 비교

puts 5<=>4
puts 5<=>6
puts 5<=>5

=begin
이 연산자는 두 값을 비교하고 결과를 다음 값 중 하나로 반환합니다:

-1: 왼쪽 값이 오른쪽 값보다 작을 때
0: 왼쪽 값이 오른쪽 값과 같을 때
1: 왼쪽 값이 오른쪽 값보다 클 때

추가로 == 이거는 값 === 이거는 타입이 같을때를 말한다. 
=end

 

조건문

apple=3
num=3

if apple < num
  puts "웅"
elsif apple > num  
  puts "아닝"
else 
  puts "zzz"
end

# end는 필수다!!!!

 

반복문

# 강추!!
5.times { |i| puts "반복 횟수: #{i}" }

# for 문 여기서 ...이 3개이면 -1 적용 즉 아래는 1 2 3 4 5 지만 1 2 3 4 가됨
for i in 1..5
  puts "for"
end

# while 문
count=0
while count < 5
  puts "while"
  count+=1 # 루비는 ++ 이런거 없음
end

# 리스트 순회는 이렇게 each 사용해서 아니면 for문 사용해서 해두됨 

array=[1,2,3,4,5]

array.each do |nc|
  puts nc 
end

array.each_with_index do |nc, index|
  puts "#{index}: #{nc}"
end



# 문자열 순회 배열이랑 다름!
message.each_char do |char|
end

# 문자열 인덱스도 알기 위해
S.each_char.with_index do |char, i|
end


# N은 무조건 숫자
N.times do |i|
  name[i] = gets.chomp.to_s
end

# 배숫씩 증가
 for i in (number..N).step(number)
 
 # 단계 줄이기
 for j in (number - 1).step(1, -1)

응용

arr=[]

# 입력
row, col=gets.chomp.split.map(&:to_i)

row.times do
  data=gets.chomp.split.map(&:to_i)
  arr << data
end

# 전체 배열 보기
arr.each { |row| puts row.inspect }


# 따로 출력 
arr.each do |row|
  row.each do |value|
    print value, " "
  end
  puts
end

 

배열 응용  

arr= [1, 2, 3]

# 배열 초기화 
alphabet = Array.new(26, false)

# 입력
arr << 4
arr.push(5)

# 맨앞에 추가 unshif
arr.unshift(1)

# 마지막 요소 제거하고 반환
back=arr.pop

# 첫번째 요소 제거하고 반환
front=arr.shift

# 특정 요소 삭제 즉 2인것들 다 제거 
arr.delete(2)

# 특정 위치 요소 삭제 2번쨰 자리 제거
arr.delete_at(2)

# 값 경신 
arr[2]=10

# 특정 값 찾기 즉 2를 찾으면 2의 위치가 나옴  
index_of arr.index(2)

# 오름차순 및 내림차순 ! 붙이면 원본 바뀜
arr1=arr.sort!
arr2=arr.sort.reverse

# 거꾸로 순서 ! 붙이면 원본 바뀜
arr3= arr.reverse

# 깊은 복사
copy = arr.dup

# 배열 크기 및 사이즈 
m=arr.size 
m=arr.length

#비웠냐
left_stack.empty?
# 중복 요소 제거
uniq2= arr.uniq

# 특정 요소 포함
array = [1, 2, 3]
puts array.include?(2)   # true

# 특정영역 넣기 리스트 및 문자열 동일
stack.insert(cursor, view[1])

# 중복제거
def remove_duplicates(arr)
  arr.uniq
end

# 어떤게 더 많이 있나
arr=["apple", "banana", "apple", "orange", "banana", "apple"]
integer = arr.max_by { |e| arr.count(e) }


# 배열 요소 중 큰값 
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5]
puts arr.max 

# 이중 배열일떄 큰값
queue.push([num, j]) 
max_priority = queue.map { |q| q[0] }.max


# 위치 답1
arr=[1,2,3]
puts arr.index(2)

 

 

해쉬 셋

hash = { "name" => "Alice", "age" => 25 }

# 값 접근
puts hash["name"]  # 출력: Alice

# 값 추가
hash["city"] = "Seoul"

puts hash.inspect  # 출력: {"name"=>"Alice", "age"=>25, "city"=>"Seoul"}


require 'set'

set = Set.new([1, 2, 2, 3])
puts set.inspect  # 출력: #<Set: {1, 2, 3}>

# 값 추가
set.add(4)
puts set.inspect  # 출력: #<Set: {1, 2, 3, 4}>

# 값 포함 여부 확인
puts set.include?(2)  # 출력: true
puts set.include?(5)  # 출력: false

# 값 삭제
set.delete(3)
puts set.inspect  # 출력: #<Set: {1, 2, 4}>

 

날짜

require 'date'

today = Date.today
puts today  # 출력: 2025-01-23 (현재 날짜)

birthday = Date.new(1995, 5, 12)
puts birthday  # 출력: 1995-05-12

 

 

메서드

def greet(name)
  puts "Hello, #{name}!"
end

greet("Alice")  # 출력: Hello, Alice!
greet("Bob")    # 출력: Hello, Bob!


def add(a, b)
  return a + b
end

puts add(2, 3)  # 출력: 5



def abcd(i,message)
  puts i
  puts message
  puts "a"
  return "오케이"
end
a=""

5.times { a = abcd(3, "g")
}

puts a

abcd(3,"g")

 

 

수학 함수

a = 10
b = 20
max_value = [a, b].max
puts max_value  # 20


numbers = [5, 15, 25, 10]
max_value = numbers.max
puts max_value  # 25

puts (-10).abs     # 출력: 10
puts 5.abs         # 출력: 5
puts (-3.14).abs   # 출력: 3.14


#최대 최소
min_length = Float::INFINITY
max_length = -Float::INFINITY

 

아스키 코드 

# 자바랑 다르게 ord chr 이용해서 해결해야됨!
message=['a','b']

place = message[0].ord

word=(place+1).chr
puts word

 

문자 

message="gggg"

# trim 앞 뒤 공백제거
message.strip

# 대문자
message.upcase

# 소문자
message.downcase

# 문자가져오기
message.slice(1,3)

# 문자 특정 위치 바꾸기
message[0]='g'
message[0,2]="dd"

# 숮자 및 문자열 변환
num=1 
num.to_s
num.to_i


# 특정 문자 인덱스참고로 r은 마지막 index는 그냥 처음 
index = input.index('*')
index = input.rindex('*')

# 특정 문자 갯수  
count = input.count('*')

 

응용2

('a'..'z').each do |char|
    position = []


# 문자열 돌리기 
 message.chars.each_with_index do |mess, index|
   position << index if mess == char
 end
 
 
 # 해쉬 생성
 positions = Hash.new { |h, k| h[k] = [] }  

  # 각 문자의 등장 인덱스를 저장
  message.chars.each_with_index do |char, idx|
    positions[char] << idx
  end


  # 해쉬 탐색 a: char, [1,3,4]: indices
  positions.each do |char, indices|

 

스택

N = gets.chomp.to_i

stack = []
N.times do
  message = gets.chomp.split.map(&:to_s)

  case message[0]
  when "push"
    stack.push(message[1].to_i)

  when "pop"
    num = stack.pop
    if num == nil
      puts -1
    else
      puts num
    end
  when "size"
    puts stack.size
  when "empty"
    if stack.empty?
      puts 1
    else
      puts 0
    end
  when "top"
    if stack.size == 0
      puts -1
    else
      puts stack.last
    end
  end
end

 

N=gets.chomp.to_i

queue=[]

N.times do
  message=gets.chomp.split.map(&:to_s)

  case message[0]
  when "push"
    queue.push(message[1].to_i)
  when "pop"
    num = queue.shift
    if num == nil
      puts -1
    else
      puts num
    end
  when "size"

    puts queue.size
  when "empty"
    if queue.empty?
      puts 1
    else
      puts 0
    end
  when "front"
    if !queue.empty?
      puts queue.first
    else
      puts -1
    end
  when "back"
    if !queue.empty?
      puts queue.last
    else
      puts -1
    end
  end
end


# 이중 배열일떄
index = input.rindex('*')

 

객체

class Car
  attr_accessor :id, :name  # 자동으로 getter와 setter 생성

  def initialize(id = nil, name = nil)
    @id = id
    @name = name
  end
end

car = Car.new("1","기")  # new 키워드는 클래스명 뒤에 직접 사용
car.id = "123"  # setId에 해당
car.name="승호"
puts car.name   # getName에 해당
728x90