1. 객체 지향 언어가 상태를 가져서 좋은 점은?

  • 상태 = 객체의 속성 = 해당 객체가 가지고 있는 데이터 → 객체의 특성을 정의하고 객체가 수행할 수 있는 작업을 결정
  • 상태가 중요한 이유
    • 데이터 보관 : 해당 객체가 가진 데이터를 보관한다.
    • 행동 지정 : 객체가 수행할 수 있는 작업을 결정하는데 중요한 역할을 한다.
    • 상호 작용 : 객체들 간에 서로의 상태를 변경하고 이를 통해 상호작용을 할 수 있다.
    • 시스템 상태 관리 : 시스템의 상태를 객체들의 상태의 집합으로 나타낼 수 있다.
    • 객체에 새로운 상태를 추가하거나 상태를 변경함으로써 기능을 확장할 수 있다.

2. JIT 컴파일러

  • 프로그램이 실행되는 동안 필요한 부분을 실시간으로 컴파일해서 기계어로 변환하는 동적 컴파일 방식
  • 장점
    • 실행 도중에 컴파일을 하기 때문에 실행 환경에 최적화된 기계어를 생성할 수 있다.
    • 실행 환경에 최적화된 기계어를 만들기 때문에 여러 플랫폼에서 실행될 수 있다.
    • 필요한 코드만을 실행시키기 때문에 메모리를 효율적으로 관리할 수 있다.

3. .class vs .jar vs .war

  • .class : 자바 소스 코드를 컴파일하여 생성한 바이트 코드 파일. JVM에서 실행된다. 
  • .jar
    • 자바 애플리케이션 또는 라이브러리 배포에 사용되는 파일.
    • 자바 클래스 파일, 리소스 파일, 메타데이터 파일들을 하나로 묶은 압축 파일.
    • 클래스 파일과 관련된 리소스들을 패키징하고 배포하는 데 사용된다.
  • .war 
    •  웹 애플리케이션을 패키징하고 배포하기 위한 파일.
    • 서블릿, JSP, HTML, 이미지, CSS 및 기타 웹 애플리케이션 구성 요소들을 포함할 수 있다.

4. 동시성 이슈

  • 멀티 스레딩 프로그램에서 발생할 수 있는 여러가지 문제
    • 경쟁 조건( Race Condition ) : 여러 스레드가 공유된 자원에 동시에 접근하려고 할 때 발생되는 문제
    • 데드락( Deadlock ) : 두 개 이상의 스레드가 서로가 소유한 자원을 대기하고 있어 상황을 벗어나지 못하는 상태
    • 스레드 안정성( Thread Safety ) : 여러 스레드가 동시에 접근해도 안전하게 사용될 수 있는 프로그램의 속성 
  • synchronized 키워드 사용
    • synchronized 키워드를 메서드나 블록에 선언해서 임계 영역으로 설정한다. 
    • 임계 영역인 코드는 스레드가 하나만 진입할 수 있고 진입 시점에 락(lock)을 획득하고 실행이 끝나면 락을 해제한다.
    • 락이 획득된 임계 영역에 접근하려는 스레드는 대기열에 있게 되고 락이 해제된 뒤 락을 획득하고 접근할 수 있다.
  • synchronized vs ReentrantLock
    • 둘 다 임계 영역에 재진입할 수 있지만 ReentrantLock에서는 명시적으로 생성되어야 한다.
    • synchronized는 공정한 락만 제공하지만 ReentrantLock은 비공정한 락도 제공한다.
    • ReentrantLock은 락의 범위를 더 유연하게 세밀하게 설정할 수 있다.

5. 클래스 변수는 GC의 대상이 되는가? 어떤 메모리에 저장되는가? GC의 대상이 되는 변수는?

  • 클래스 변수는 메서드 영역에 저장된다. 
  • GC의 대상은 주로 힙 영역이지만 메서드 영역이나 스택 영역도 대상이 될 수 있다.
  • 클래스/인스턴스/지역/매개 변수 모두 GC의 대상이 될 수 있다.
  • 어떤 영역에 있든 객체가 참조되어 있지 않다면 GC의 대상이 된다.
  • static final 변수는 GC의 대상이 되지 않는다. 

6. 메모리가 디스크보다 데이터에 대한 접근 속도가 빠른 이유는?

  • 메모리와 CPU는 동일한 버스를 사용하기 때문에 데이터의 전송 속도가 더 빠르고 디스크는 디스크 컨트롤러를 통해 이루어지기 때문에 더 느리다.
  • 메모리는 캐시 메모리와 함께 동작하기 때문에 더 빠르고 디스크도 캐시가 있긴 하지만 사용률이 크지 않기 때문에 더 느리다.
  • 메모리는 전기적 신호에 의해 데이터에 빨리 접근하지만 디스크는 회전하는 디스크나 플래시 기반 메모리를 사용하여 데이터에 접근하기 때문에 더 느리다. 

7. String 상수 풀 저장 위치(java7 vs java8)

  • Permanent Generation 메모리 영역 → Metaspace 영역
  • permgen 은 자바 힙 영역에 있었고 Metaspace 는 네이티브 메모리 영역에 있다. 
  • permgen은 메모리가 제한된 크기를 가지고 있고 Metaspace 동적으로 크기를 조절할 수 있다.

 

8. ArrayList 동작 방식

  • 끝에 요소를 추가하는 경우 :  arraylist의 상태를 확인하고 현재 배열의 크기의 1.5배의 새로운 배열을 생성한다. 새로 생성한 배열에 원래 배열의 값을 인덱스도 그대로 복사한다. 새로운 요소를 배열의 마지막 인덱스에 저장한다. 원래 배열은 사용되지 않는 메모리로 해제된다.
  • 중간에 요소를 추가하는 경우 : arraylist의 상태를 확인하고 현재 배열의 크기의 1.5배의 새로운 배열을 생성한다. 새로 생성한 배열에 원래 배열의 값을 인덱스도 그대로 복사한다. 새로운 요소를 추가할 인덱스부터 기존의 값들을 뒤로 하나씩 미룬다. 해당 인덱스에 값을 저장한다.  원래 배열은 사용되지 않는 메모리로 해제된다.
  • 삭제할 경우 : 삭제할 요소의 인덱스 이후의 값들을 앞으로 하나씩 이동하고 해당 요소를 제거한 뒤 배열의 크기를 1 감소시킨다.

9. Static Block이란? 언제 사용하는지? 단점은?

  • Static Block
    • 클래스가 로드될 때 실행되는 블록. 클래스가 처음으로 로드될 때 한 번만 실행된다.
    • 클래스 내에 선언되어야 하고 메서드 내에서는 선언될 수 없다.
    • 여러 개 선언될 수 있으며 선언된 순서대로 호출된다.
    • static 블록 안에서는 static한 것만 호출할 수 있다.
  • 정적 변수나 정적 메서드를 초기화하는 것처럼 클래스를 초기화할 때 꼭 수행되어야 하는 작업이 있을 경우 사용될 수 있다.
  • 단점 : 블록 안에서 수행되는 것이 많을수록 초기에 클래스 로드하는데 시간이 지연될 수 있고, 블록이 많이 선언되어 있거나 블록 안의 변수나 객체가 많을 경우 메모리를 많이 쓰게 된다.

10. Pass by value와 Pass by reference의 차이는?

  • 매개 변수가 함수에 전달될 때 값이 전달되는 방식
  • Pass by value(값에 의한 전달) 
    • 함수에 전달되는 매개변수의 값이 복사되어 전달된다.
    • 함수 내에서 값이 변경되어도 호출자에 영향을 주지 않는다.
    • 원래 변수의 값이 변경되지 않는다.
    • 기본형 변수에 대해 적용된다.
  • Pass by reference(참조에 의한 전달) : 
    • 함수에 전달되는 매개변수의 참조가 전달된다.
    • 함수 내에서 매개변수를 통해 원래 변수를 변경할 수 있고 호출자에게 영향을 준다.
    • 객체나 배열 등 참조 타입에 적용된다.

11. Java는 포인터 없는 언어라고 했는데 왜 NullPointerException이 발생하는 걸까요?

  • 포인터의 개념은 메모리상에서 주소를 참조하는 변수를 뜻한다.
  • 자바에서는 직접적으로 포인터라는 개념을 사용하지는 않지만 참조형 변수가 포인터와 유사한 역할을 한다.
  • 참조형 변수가 null을 가리키는 상태에서 객체의 멤버나 메서드를 참조하려고 할 때 NullPointerException이 발생한다. 

12. 그 밖의 포인터 관련 개념들

13. JVM의 구조와 작동 원리에 대해 더 깊이 공부하기

 

 

※ 용어사전 & 참고사항

  • 자바 애플리케이션과 웹 애플리케이션 : 자바 애플리케이션은 로컬 환경에서 실행(자바 기반의 데스크톱 애플리케이션이나 콘솔 응용 프로그램)되며, 사용자와 직접 상호작용하거나, 특정 작업을 수행하는 프로그램을 의미하며, 웹 애플리케이션은 웹 브라우저를 통해 실행되며, 네트워크를 통해 사용자에게 제공되는 서비스를 의미한다.
  • 임계 영역 : 여러 스레드가 동시에 접근하면 안되는 코드 영역
  • 메타데이터 : 데이터에 대한 데이터. 데이터를 설명하거나 분류하기 위한 정보 
  • 메타스페이스(Metaspace) : 자바의 클래스로더가 로드한 클래스들의 메타데이터가 저장되는 공간

 

'공부 > f-lab' 카테고리의 다른 글

f-lab 6주차  (0) 2024.04.24
f-lab 5주차  (0) 2024.04.16
f-lab 4주차  (0) 2024.04.09
f-lab 3주차  (0) 2024.04.02
f-lab 1주차  (0) 2024.03.19
  • 1. Java 언어를 사용하는 이유 / 장점 / 단점
    • 이유와 장점
    • - 자바는 한번의 개발로 여러 플랫폼에서 실행할 수 있다는 플랫폼 독립성을 가지고(WORA = Write One, Run
    •    Anywhere), JVM위에서 실행되기 때문에 운영 체제에 상관없이 동일한 코드가 동작한다.
    • - 자바는 객체 지향 프로그래밍의 장점을 제공함으로써 코드의 재사용성, 유지보수성, 확장성을 향상시킨다.
    • - JIT(Just-In-TIme) 컴파일러를 통해 런타임 성능이 향상되었다. 
    • - 다중 스레드 지원, 자동 메모리 관리 등의 기능이 대규모 시스템 개발에 적합한 환경을 제공한다.
    • - 표준 라이브러리와 오픈 소스 라이브러리가 풍부하다.
    • - 가상 머신을 통해 실행되기 때문에 악성 코드의 실행을 제한하도 다양한 보안 기능을 적용할 수 있다.
    •  
    • 단점
    • - 가비지 컬렉션 메커니즘과 가상 머신의 오버헤드 때문에 자바 프로그램은 메모리 사용량이 크다.
    • - 무거운 IDE(통합 개발 환경)을 사용해야 하기 때문에 초기 설정이나 메모리 사용양 측면에서 불편할 수 있다. 
  • 2. 객체지향 언어의 장점 / 단점
    • 장점
    • - 모듈화 : 모드를 객체로 나누어 모듈화할 수 있다. → 코드의 재사용성 증가, 유지보수 용이
    • - 상속 : 부모 클래스의 속성과 메서드를 자식 클래스가 상속받는 기능 → 코드 중복 방지, 코드 일관성 유지
    • - 다형성 : 하나의 인터페이스나 추상 클래스를 통해 여러 객체를 다룰 수 있는 기능 → 코드 유연성, 확장성
    • - 캡슐화 : 객체의 상태와 행위를 하나로 묶어 외부로부터 은닉하는 기능 → 코드의 안정성과 보안
    • - 재사용성 : 코드를 재사용하기 쉽도록 설계함 
    •  
    • 단점
    • - 적절한 객체와 클래스의 설계가 복잡할 수 있다.
    • - 각 객체의 상태를 저장하기 위한 메모리가 필요하기 때문에 프로그램의 메모리 사용량을 늘릴 수 있다.
    • - 상속을 오용하면 클래스 간의 결합도가 높아지고 유연성이 감소할 수 있다.
  • 3. 절자 지향 프로그래밍과 객체 지향 프로그래밍의 차이
    • 절차 지향 프로그래밍
    • - 프로그램을 순차적인 절차로 나누어 설계한다.
    • - 데이터와 관련된 함수들이 따로 존재하며 이러한 함수들이 데이터를 처리하며 데이터에 대한 직접적인 접근이 
    •   가능하다.
    • - 함수의 구조가 간단하여 작은 규모의 프로그램에서는 유지보수가 용이할 수 있지만, 큰 규모릐 프로그램에서는
    •   유지보수가 어려울 수 있다.
    •  
    • 객체 지향 프로그래밍
    • - 프로그램들을 객체들의 집합으로 구성하고 객체 간의 상호 작용을 통해 프로그램이 동작한다.
    • - 데이터와 해당 데이터를 조작하는 메서드가 하나의 단위인 객체로 묶여 있다.
    •  
    • ★ 절차 지향 프로그래밍은 프로그램을 명령어의 집합으로 구성하고, 데이터와 함수를 분리하여 작성하는데 초점
    •     을 맞춘다. 객체 지향 프로그래밍은 프로그램을 상호 작용하는 객체들의 집합으로 구성하며 데이터와 해당 데
    •     이터를 조작하는 함수를 객체로 묶어 설계한다.
  • 4. JVM 기초 (클래스 로더, 런타임 데이터 영역, 실행 엔진 등) -> 특히 런타임 데이터 영역 자세히
    • JVM이란?
    • 자바 프로그램이 실행되는 가상 머신. 자바 바이트 코드를 해석하고 실행하여 호스트 플랫폼(운영 체제 및 하드웨어)에 독립적으로 자바 프로그램을 실행할 수 있도록 한다.
    •  
    • - 바이트 코드 해석기 : 자바 컴파일러에 의해 변환된 바이트 코드를 해석하고 실행 
    • - 가비지 컬렉터 : 자동 메모리 관리를 위해 더 이상 사용되지 않는 객체를 자동으로 탐지하고 해제하여 메모리 누
    •   수를 방지한다.
    • - 메모리 관리 : 힙 영역과 스택 영역으로 구분된 메모리 공간을 관리한다. 힙은 객체와 배열이 저장되는 영역이고,
    •   스택은 메서드 호출과 관련된 지역 변수 및 실행 정보를 저장한다.
    • - 클래스 로더 : 동적으로 필요한 클래스 파일을 로드하고 연결한다. 
    • - 런타임 데이터 영역 : JVM이 자바 프로그램을 실행하는 동안 데이터를 저장하고 관리하는 메모리 영역
      • 1) 메서드 영역 : 클래스 및 메서드의 바이트 코드, 정적 변수, 메서드 정보 등을 저장한다. JVM이 시작될 때
      •     생성되며, 모든 스레드가 공유하는 공간이다.
      • 2) 힙 영역 : JVM이 시작될 때 미리 할당되며, 가비지 컬렉터에 의해 관리된다. 
      • 3) 스택 영역 : 각 스레드마다 개별적으로 할당된다. 스택 프레임은 각 메서드 호출 시마다 스택 영역에 생성
      •     되며, 메서드 실행이 완료되면 해당 프레임이 제거된다.
      • 4) PC 레지스터 : 현재 실행중인 스레드의 명령어 주소를 저장한다.
      • 5) 네이티브 메서드 스택 : 자바 코드가 네이티브 코드를 호출할 때 사용된다.
      •  
      • ※ JVM내에서 메서드 영역과 힙 영역은 하나, 스택 영역/PC 레지스터/네이티브 메서드 스택은 스레드의 개수만큼 생성된다. 
      •  
    • - 실행 엔진 : 바이트 코드를 기계어로 변환하고 실행하는 과정을 담당한다. 
    •  
  • 5. java의 .class 파일은 언제 기계어가 되는가?
    • - JVM의 인터프리터나 JIT 컴파일러에 의해 변환될 때 
  • 6. .class 파일 vs war 파일
    • - class 파일은 자바 프로그램의 클래스와 인터페이스를 나타내고 war 파일은 웹 애플리케이션의 자원과 파일들을 포함하여 배포할 수 있는 형식이다. class 파일은 자바 컴파일러에 의해 만들어지고 war 파일은 빌드로 만들어진다.
  • 7. 컴파일과 빌드의 차이
    • - 컴파일 : 소스 코드를 바이트 코드나 기계어로 변환하는 과정
    • - 빌드 : 소프트웨어 프로젝트를 실행 가능한 형태로 만드는 과정
  • 8. 멀티 스레딩 환경에서 static 변수를 여러 곳에서 고치려고 할 때 단점
    • - 경쟁 상태 : 두 개 이상의 스레드가 동시에 공유된 자원에 접근하려고 할 때 예상치 못한 결과가 발생한다. 
    • - 일관성 유지의 어려움 : 변수의 일관성을 유지하기 어렵다. 
    • - 데이터 손실 가능성 
    • - 성능 저하 : 동기화 메커니즘을 사용하여 여러 스레드 간의 경쟁 상태를 방지하려고 하면 성능 저하가 발생할 수
    •   있다.
  • 9. 싱글 스레딩 환경에서 static 변수를 여러 곳에서 고치려고 할 때 단점
    • - 단일 스레드 환경에서는 여러 스레드가 존재하지 않기 때문에 경쟁 상태가 일어나지 않는다. 변수를 여러 곳에
    •   서 고치더라도 다른 스레드가 변수에 접근하는 일은 없다.
  • 10. equals() vs hashCode() (특히 해시 코드가 무엇인지 학습)
    • - 두 메서드는 모두 객체의 동등성을 확인하는 메서드이다. (참고 : == 은 두 객체의 동일성 확인)
    • - equals() : 객체의 내부 상태를 비교하여 두 객체가 동등한지를 비교한다.
    • - hashCode() :  객체의 해시코드값을 반환한다. 해시코드란 데이터에 고정된 길이의 정수값을 주는 것이고 데이터를 빠르게 검색하고 비교하는 데 사용한다.
    • - 두 메서드를 함께 오버라이딩 해야 하는 이유는 equals()로 두 객체가 같다고 판단되면 두 객체는 같은 해시코드
    •   를 반환하는데 해시 기반의 자료 구조는 해시코드를 이용해 객체를 검색하기 때문에   equals()와 hashCode()가
    •   일관되지 않으면 같은 두 객체가 다른 객체로 인식될 수 있기 때문이다.
  • 11. 객체와 클래스, 인스턴스의 차이
    • - 클래스 : 객체를 생성하기 위한 , 객체의 특성(속성)과 메서드를 정의하는데 사용된다.
    • - 객체 : 클래스의 인스턴스, 클래스를 기반으로 실제로 메모리에 할당된 데이터를 가지고 있다.
    • - 인스턴스 : 클래스를 사용하여 생성된 특정한 객체
  • 12. 객체 지향 프로그래밍이란? (역할, 책임, 상태, 행동, 협력 키워드 이해하기)
    • - 역할 : 객체가 수행할 수 있는 특정한 기능이나 역할
    • - 책임 : 객체가 역할을 수행하기 위해 가져야 하는 의무나 기능
    • - 상태 : 객체가 가지고 있는 데이터의 상태
    • - 행동 : 객체가 수행할 수 있는 작업이나 동작
    • - 협력 : 객체 간의 상호 작용
  • 13. GC란 무엇이고, 어느 메모리 영역이 대상인가?
    • - 가비지 컬렉터란 프로그램에서 더 이상 사용되지 않는 객체를 자동으로 탐지하여 데이터를 해제하는 역할을 한다. 메모리 영역이 그 대상이고 객체가 더 이상 참조되지 않을 때 해제하여 메모리를 확보한다.  
  • 14. GC의 대상이 되는 변수는? (class, instance, argument, local 변수 중에)
    • - 클래스 변수 : 클래스 변수는 프로그램이 종료될 때까지 메모리에 유지되기 때문에 대상이 되지 않는다.(해당 클
    •   래스의 모든 인스턴스들이 공유하는 변수이기 때문에)
    • - 인스턴스 변수 : 클래스 내에 선언된 변수로, 객체가 생성될 때마다 각각의 인스턴스에 대해 별도의 메모리 공간
    •   이 할당된다. 객체가 더 이상 참조되지 않을 때 가비지 컬렉터의 대상이 된다.
    • - 매개 변수 : 메서드의 수행 도중에만 사용되는 값으로 메서드의 실행이 완료되면 메모리에서 해제된다.
    • - 지역 변수 : 메서드 내에 선언된 변수로, 메서드가 호출될 때 스택 프레임 내에 할당 되었다가 메서드가 실행을
    •   완료하고 스택 프레임이 제거되기 때문에 메모리에서 해제된다.
  • 15. 디스크와 메모리의 차이
    • - 디스크 : 느리고 저렴하지만 대용량 데이터를 영구적으로 보관할 수 있다. 데이터의 영구적인 저장과 검색에 사
    •   용된다.
    • - 메모리 : 빠르고 비싸며 휘발성이 있다. 프로그램 및 애플리케이션의 실행에 사용된다.
  • 16. String literal vs new String("")
    • - String literal : String Constant Pool에 같은 문자열이 있는지 확인하고 있으면 그 객체를 재사용한다. 
    • - new String("") : 문자열을 재사용하지 않고 새로운 문자열 객체를 생성한다.
  • 17. String Constant Pool이란?
    • - 문자열 상수 풀은 문자열 리터럴이 저장되는 공간. 문자열 리터럴을 생성하면 이곳에 저장된다. 
    • - 중복 문자열 제거 : 동일한 문자열 리터럴을 하나의 인스턴스로만 저장하고 재사용한다.
    • - 힙 영역과 다른 메모리에 저장된다.
    • - 가비지 컬렉터의 영향을 받지 않음 : 프로그램이 실행되는 동안 계속해서 유지된다.
    • - 해당 클래스가 로딩될 때 생성됙 프로그램이 실행되는 동안 유지된다.
  • 18. 동시성 이슈
    • - 여러 스레드가 동시에 공유된 자원에 접근할 때 생길 수 있는 문제

 

※ 용어사전 

  • 인터프리터 : 프로그래밍 언어의 소스 코드를 한 줄씩 읽고 해석하여 실행하는 프로그램(  컴파일러)
  • 자바 컴파일러 : 개발자에 의해 작성된 자바 코드를 JVM이 이해할 수 있는 바이트 코드로 변환하는 컴파일
  • JIT(Just-In-TIme) 컴파일러 : 인터프리터와 컴파일러의 중간 형태로, 프로그램을 실행하는 도중에 필요한 부분을 실시간으로 기계 코드로 컴파일하는 컴파일러
  • 가상 머신의 오버헤드 : 가상 머신 환경에서 추가적으로 발생하는 성능 손실
  • 객체 지향 프로그래밍 : 현실 세계의 개체를 모델링하고 그들 간의 상호 작용을 표현하는 프로그래밍 패러다임
  • 네이티브 코드 : 해당 플랫폼의 CPU가 이해하고 실행할 수 있는 기계어로 작성된 코드
  • 동일성 : 객체가 메모리 상에서 같은 인스턴스를 가리키는지를 비교하는 메서드
  • 동등성 : 객체가 가지고 있는 내용이 같은지를 비교

'공부 > f-lab' 카테고리의 다른 글

f-lab 6주차  (0) 2024.04.24
f-lab 5주차  (0) 2024.04.16
f-lab 4주차  (0) 2024.04.09
f-lab 3주차  (0) 2024.04.02
f-lab 2주차  (0) 2024.03.26

문제

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.

단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

 

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        int N = s.nextInt(); //입력받는 문자열의 수
        s.nextLine(); //nextInt() 다음 개행 문자 읽기
        int result = 0; //그룹 단어의 수
        char prev = 0; //비교할 이전 문자
        for(int i = 0; i < N; i++){ //문자열의 개수만큼 반복
            boolean flag = true; //그룹 단어인지 체크하는 boolean
            String word = s.nextLine(); //입력한 문자열 읽어오기
            ArrayList alpha = new ArrayList(); //문자 중복 체크를 하기 위한 문자열의 문자를 저장해둘 배열
            for(int j = 0; j < word.length(); j++){ //문자열의 길이만큼 반복
                if(j == 0){ //맨 앞의 문자일 경우 이전 문자와 비교하지 않고 배열에 문자 저장 
                    alpha.add(word.charAt(j));
                }else{ //그 이후의 문자일 경우
                    if(prev != word.charAt(j)){ //이전 문자와 비교해서 다른 문자일 경우
                        if(alpha.contains(word.charAt(j))) flag = false; //문자가 배열에 있는 경우 연속되지 않고 중복된 문자이기 때문에 flag를 false로 변경
                        else alpha.add(word.charAt(j)); //문자가 배열에 없는경우 배열에 저장
                    }
                }
                prev = word.charAt(j); //이전 문자에 현재 문자 대입
            }
            if(flag == true) result++; //flag값이 true라면 그룹단어이기때문에 result 증가
        }
        System.out.println(result);
        s.close();
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 1110  (0) 2024.03.13

문제

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        int N = s.nextInt();
        int a, b, c, n;

        if(N < 10) a = 0;
        else a = N / 10;

        b = N % 10;

        c = 1;
        while (true){
            n = a + b;
            n = (b * 10) + (n % 10);
            a = b;
            b = n % 10;
            if(N == n) break;
            else c++;
        }
        System.out.println(c);
        s.close();
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준 1316  (0) 2024.03.15
  • Collection 인터페이스를 구현하는 대표적인 3개의 자료 구조에는 list, set, queue가 있다.
  • 배열과 같이 순서가 있는 목록형을 나타내는 대표 인터페이스는 list이다.
  • ArrayList라는 클래스의 생성자 중 매개 변수가 없는 기본 생성자를 사용하면 기본적으로 10개의 저장 공간을 가진다.
  • 만약 ArrayList 클래스의 저장 공간 개수를 처음부터 지정하려면 ArrayList (int initialCapacity) 생성자를 사용한다.
  • ArrayList 객체를 생성할 때 제네릭을 사용하는 이유는 대부분 서로 다른 종류의 객체를 하나의 배열에 넣지 않고 한 가지 종류의 객체만 저장하기 때문이다.
  • ArrayList에 데이터를 담는 메소드 이름 두 가지는 add와 addAll이다.
  • Collection 인터페이스를 구현한 클래스의 객체 크기를 확인하는 메소드는 size()이다.
  • ArrayList에서 특정 위치에 있는 데이터를 확인하는 메소드는 get(int index)이다.
  • ArrayList 에서 특정 위치에 있는 데이터를 삭제하는 메소드는 remove(int index)이다.
  • ArrayList 에서 특정 위치에 있는 데이터를 수정하는 메소드는 set(int index, E element)이다.
  • Stack이라는 클래스는 Vector클래스를 확장한 것이다.
  • Stack 클래스에서 데이터를 담는 메소드는 push(E item)이다.
  • Stack 클래스에서 가장 위에 있는 데이터를 확인만 하는 메소드는 peek()이다.
  • Stack 클래스에서 가장 위에 있는 데이터를 삭제하고 리턴하는 메소드는 pop()이다.
  • 자바 패키지 중 같은 패키지에 있는 클래스를 제외하고, 별도로 import하지 않아도 되는 패키지는 java.lang 패키지이다.
  • 자바의 메모리가 부족해서 발생하는 에러는 OutOgMemoryError이다.
  • 메소드 호출 관계가 너무 많아서 발생하는 에러는 StackOverFlowError이다.
  • java.lang 패키지에 선언되어 있는 3개의 어노테이션
    • override : 부모클래스에서 상속받은 메소드
    • deprecated : 더이상 사용하지 않는 메소드
    • SuppressWarnings : 경고인걸 알고 있다고 알려줌
  • Double과 Integer 같은 숫자 타입에서 처리할 수 있는 최대, 최솟값을 알 수 있는 상수의 이름은 MIN_VALUE, MAX_VALUE이다.
  • Integer 값을 2진법으로 표현하려면 toBinaryString() 메소드 사용, 16진법으로 표현하려면 toHexString() 메소드를 사용한다.
  • 속성(Properties)과 환경(Environment)값의 차이는 속성은 변경, 추가가 가능하지만 환경을 읽기만 할 수 있다.
  • System.out 과 System.err 에서 사용할 수 있는 메소드들을 확인하려면 PrintStream 클래스를 확인해야 한다.
  • System 클래스에서 현재 시간을 조회하는 용도로 사용하는 메소드는 currentTimeMillis()이다.
  • System 클래스에서 시간 측정 용도로 사용하는 메소드는 nanoTime()이다.
  • System.out.println() 메소드에 객체가 매개 변수로 넘어 왔을 때 String의 valueOf() 메소드가 호출되어 결과를 출력한다. 
  • String 클래스는 final 클래스로 자식클래스를 양산할 수 없고 있는 그대로 사용해야 한다.(불변성)
  • String 클래스가 구현한 인터페이스에는 Serializable, Comparable<String>, CharSequence가 있다.
    • Serializable : 구현해야 하는 메소드 없음, 해당 객체를 파일로 저장하거나 다른 서버에 전송 가능한 상태가 됨
    • Comparable<String> : compareTo()
    • CharSequence : 해당 클래스가 문자열을 다루기 위한 클래스라는 것을 명시적으로 나타냄
  • String 클래스의 생성자 중 가장 사용할 필요가 없는 생성자는 기본생성자인 String()이다.
  • String 문자열을 byte 배열로 만드는 메소드의 이름은 getBytes()이다.
  • String 문자열의 메소드를 호출하기 전에 반드시 점검해야 하는 사항은 객체가 null인지 확인하는 것이다.
  • String 문자열의 길이를 알아내는 메소드는 length()이다.
  • String 클래스의 equals() 메소드와 compareTo() 메소드의 공통점과 차이점
    • 공통점 : 매개 변수로 넘어온 값과 String 값을 비교하는 메소드
    • 차이점 : equals()의 리턴 타입은 boolean이고 compareTo()의 리턴 타입은 int로 같으면 -1(하나 앞일 때), 0(같을 때), 1(하나 뒤일 때) 등의 값으로 리턴된다.
  • 문자열이 "서울시"로 시작하는지를 확인하려면 String의 startsWith("서울시") 메소드를 사용해야 한다.
  • 문자열에 "한국"이라는 단어의 위치를 찾아내려고 할 때는 String의 indexOf( "한국" ) 메소드를 사용해야 한다. 값이 없을 때 결과값은 -1이다.
  • 문자열의 1번째부터 10번째 위치까지의 내용을 String으로 추출하려면 subString(0, 9) 메소드를 사용해야 한다.
  • 문자열의 모든 공백을 * 표시로 변환하려면 replace(" ", "*") 메소드를 사용해야 한다.
  • String의 단점을 보완하기 위한 클래스에는 StringBuffer와 StringBuilder가 있다. 이 클래스에서 문자열을 더하기 위한 메소드는 append()이다.
  • 예외를 처리하기 위한 세 가지 블록에는 try, catch, finally가 있다. 
  • "여기에서 예외가 발생할 것이니 조심하세요"라고 선언하는 블록은 try 블록이다.
  • "예외가 발생하는 안하든 얘는 반드시 실행되어야 합니다"라는 블록은 finally 블록이다.
  • 예외의 종류 세가지는 checked exception, error, runtime exception(unchecked exception)이다. checked exception은 나머디 두 예외를 제외한 모든 예외이고, error는 프로그램 밖에서 발생한 오류이다.
  • 프로세스에 치명적인 영향을 주는 문제가 발생한 것을 error라고 한다.
  • try나 catch 블록 내에서 예외를 발생시키는 키워드는 throw이다.
  • 메소드 선언시 어떤 예외를 던질 수도 있다고 선언할 때 사용하는 키워드는 throws이다.
  • 직접 예외를 만들 때 Throwable 클래스의 상속을 받아서 만들어야 한다.(Exception을 처리하는 클래스라면 Exception 클래스도 가능)

+ Recent posts