앞으로 작성될 글들에서 기초 부분은 아래의 유튜브 영상을 보고 공부하였다.

여기서 배운 내용들과 추가로 공부한 내용들을 기록하기 위해 글을 작성한다.

https://youtu.be/m2j_Y245xew

 

또한 공식문서에도 많은 자료가 있다.

https://ko.vuejs.org/guide/introduction.html

 

Vue.js

Vue.js - 프로그래시브 자바스트립트 프레임워크

ko.vuejs.org

 

'프론트 > Vue 3' 카테고리의 다른 글

[Vue3] 1. Vue를 사용하는 이유와 설치방법  (1) 2025.03.02

팀 CRUD 구현

내가 맡은 기능은 팀 기능으로써 팀원 추가, 관리 등의 기능을 개발하게 되었다.

CRUD 별로 작성한 코드들을 정리해서 기록해두었다.

Create

  • Controller
/**
 * 팀 생성 메소드
 * @param userNo 유저번호
 * @param teamName 팀 이름
 * @param teamIntroduce 팀 설명
 * @param projectStatus 프로젝트 상태
 * @return teamResponseDto
 */
@PostMapping()
public ResponseEntity<TeamResponseDto> createTeam(
        @RequestParam Long userNo,
        @RequestParam String teamName,
        @RequestParam(required = false) String teamIntroduce,
        @RequestParam ProjectStatus projectStatus){

    TeamDto teamDto = new TeamDto(userNo, teamName, teamIntroduce, projectStatus);

    TeamResponseDto teamResponseDto = teamService.createTeam(teamDto);

    return ResponseEntity.status(HttpStatus.OK).body(teamResponseDto);
}
  • Service
TeamResponseDto createTeam(TeamDto teamDto);
  •  ServiceImpl 
    • userNo를 사용하여 해당 유저 정보를 가져옴
    • 빌더패턴을 활용하여 팀 정보를 저장
    • 유저 정보와 팀 정보를 합쳐서 TeamUser 테이블에 저장
    • 해당 팀 정보를 TeamResponseDto에 넣어 반환
      • 이 부분은 혹시 몰라서 넣어둠 (제거해도 됨)
/**
* 팀 생성
*
* @param teamDto 팀 생성 정보
* @return teamResponseDto
*/
@Override
public TeamResponseDto createTeam(TeamDto teamDto) {
  User user = userRepository.findById(teamDto.getId())
          .orElseThrow(() -> new IllegalArgumentException("유저가 존재하지 않습니다."));

  // 팀 저장
  Team team = Team.builder()
          .teamName(teamDto.getTeamName())
          .teamIntroduce(teamDto.getTeamIntroduce())
          .projectStatus(teamDto.getProjectStatus())
          .timePeriod(new TimePeriod())
          .build();
  team = teamRepository.save(team);

  // TeamUser 저장
  TeamUser teamUser = TeamUser.builder()
          .user(user)
          .team(team)
          .status(true)
          .build();
  teamUserRepository.save(teamUser);

  TeamResponseDto teamResponseDto = new TeamResponseDto(
          team.getNo(),
          team.getTeamName(),
          team.getTeamIntroduce(),
          team.getProjectStatus(),
          team.getTimePeriod()
  );

  return teamResponseDto;
}

Read

생략

이후에 따로 작성할 예정


Update

해당하는 팀이 없을 수 있기 때문에 모든 코드에 예외 처리가 되어있음

  • Controll
/**
 * 팀 수정 메소드
 * @param teamNo 팀 번호
 * @param teamName 팀 이름
 * @param teamIntroduce 팀 정보
 * @param projectStatus 팀 상태
 * @return teamDto
 */
@Operation(summary = "팀 수정 메서드", description = "팀 수정 메서드 입니다.")
@PutMapping()
public ResponseEntity<TeamDto> updateTeam(
        @RequestParam Long teamNo,
        @RequestParam String teamName,
        @RequestParam(required = false) String teamIntroduce,
        @RequestParam ProjectStatus projectStatus) throws Exception {

    TeamDto teamDto = new TeamDto(teamNo, teamName, teamIntroduce, projectStatus);

    teamService.updateTeam(teamDto);

    return ResponseEntity.status(HttpStatus.OK).body(teamDto);
}
  • Team 엔티티
    • 엔티티에 직접 대입할 수 없기에 생성자 추가
public void updateTeamDetails(String teamName, String teamIntroduce, ProjectStatus projectStatus, TimePeriod timePeriod) {
    this.teamName = teamName;
    this.teamIntroduce = teamIntroduce;
    this.projectStatus = projectStatus;
    this.timePeriod = timePeriod;
}
  • Service
TeamResponseDto updateTeam(TeamDto team) throws Exception;
  • ServiceImpl
    • 팀번호로 해당하는 팀의 정보를 먼저 찾아옴
      • 없으면 예외 반환
    • 해당 팀 정보에 변경된 정보 삽입
    • 저장 후 Dto 반환 ← 반환 값 임의로 넣어둠 (제거해도 문제없음)
/**
 * 팀 정보 수정
 *
 * @param teamDto 팀 정보
 * @return TeamResponseDto
 */
@Override
public TeamResponseDto updateTeam(TeamDto teamDto) throws Exception{

    Team searchTeam = teamRepository.findById(teamDto.getId())
            .orElseThrow(() -> new Exception("팀을 찾을 수 없습니다."));

    searchTeam.updateTeamDetails(
            teamDto.getTeamName(),
            teamDto.getTeamIntroduce(),
            teamDto.getProjectStatus(),
            new TimePeriod()
    );

    Team updateTeam = teamRepository.save(searchTeam);

    return new TeamResponseDto(
            updateTeam.getNo(),
            updateTeam.getTeamName(),
            updateTeam.getTeamIntroduce(),
            updateTeam.getProjectStatus(),
            updateTeam.getTimePeriod()
    );
}

Delete

  • Controll
/**
 * 팀 삭제 메소드
 * @param teamId 팀id
 * @return 없음
 * @throws Exception 예외없음
 */
@Operation(summary = "팀 삭제 메서드", description = "팀 삭제 메서드입니다.")
@DeleteMapping()
public ResponseEntity<String> deleteTeam(Long teamId) throws Exception {

    teamService.deleteTeam(teamId);

    return ResponseEntity.status(HttpStatus.OK).body("정상적으로 삭제되었습니다.");
}
  • Service
void deleteTeam(Long id) throws Exception;
  • ServiceImpl
/**
 * 팀 삭제
 * @param id 팀 ID
 * @throws Exception
 */
@Override
public void deleteTeam(Long id) throws Exception {

    teamRepository.deleteById(id);
}
  • Team 엔티티
    • 팀이 삭제되면 팀-유저 테이블도 삭제되도록 Cascade 설정
@OneToMany(mappedBy = "team", cascade = CascadeType.ALL, orphanRemoval = true)
private List<TeamUser> teamUsers = new ArrayList<>();

빠르게 흘러간 한 주

이번 주 수업은 저번 주에 이어서 스프링 부트에 대해 배웠다.

한번 경험해본 스프링 부트였지만 정말 상세하고 깊게 구현하고, Mybatis 를 곁들여서 공부하니

내가 알고있던 기초적인 지식보다  더 심화되어 수업을 따라가기 급급했다.

 

Mybatis를 쓰면서 느낀건 일일이 매핑하고 쿼리문을 작성하는건 정말 쉽지 않다는 점이였고,

마치 건물을 세우듯 탄탄하게 기존 뼈대를 직접 만들어 세우고 그 위에 집을 짓는 느낌이였다.

내가 직접 작성하고 매핑하였기 때문에 문제가 생겨도 조금더 이해하기 쉬울순 있으나

그렇게 편리하지는 않았다.

SpringJPA랑 비교하면 정말 편의성이 C와 파이썬 차이인것 같다.

 

이 글을 작성하면서 내가 메모해놓은 코드들을 읽어보고 있는데 메모하는 습관을 들이기 잘한 것 같다.

공부할 때 어디든 기록을 해놓으면 머릿속에 1차로 저장하고 메모장에 2차로 저장하는 RAID 시스템 같은 느낌이다.

 

스프링 시큐리티에 대해서도 배웠었는데 솔직히 난 이게 왜 어렵다는지 이해하지 못했었다.

왜냐면 예전에 내가 작업할 때는 코드 몇줄만 넣으면 알아서 적용이 되었기에 이에 대한 예외 처리라던지 그런것만 해주면

해결되었던걸로 기억했기 때문이였다.

 

그런데 강의시간에는 그걸 하나하나 다 구현해봄으로써 더 심화적으로 볼 수 있었고, 왜 어렵다는지 이해하게 되었다.

실제로 그렇게 다시 구현해서 쓸 것 같진 않지만 이론적인 측면에서 이해하는데는 도움이 된 것 같다.

 

이외에도 스웨거(Swagger) 를 사용하여 테스트를 하는 방법에 대해서도 배웠는데 이것도 너무 깊게 들어가면

배보다 배꼽이 커지는 상황이 오는 것 같아 적당히 사용하는게 좋을 것 같다는 생각이 들었다.

코드를 설명할 땐 제일 나은 상황은 그냥 그 코드를 보자마자 이해할 수 있게 쉽고 간결하게 짜는게 중요하지

설명만 덕지덕지 붙여놓으면 오히려 그게 독이 될수도 있다는 생각이 들었다.

 

JWT(JSON Web Token)에 대해서도 배웠는데 이 부분은 예전에 OAuth를 구현할 때 필요해서 사용해본 적이 있다.

로그인 할때 세션과 JWT 방식이 있는데 상세한 차이는 유튜브로 따로 공부하였다.

간단히 말해서 세션은 정말 간결한 정보만 가지고 있지만 JWT는 더 다양한 정보를 포함한 Json타입이다.

 

둘 중 어느게 더 좋다고는 말 못하지만 왠만해서 대규모 트래픽 처리가 필요한 경우가 아니고서야

간단하게 세션만 써서 로그인을 구현하는것도 문제될건 없다고 생각한다.

어느 기술이 더 좋고 나쁘고가 있는게 아니라 필요에 따라서 내가 그 기술을 선택하는게 중요하다고 생각한다.

 

첫 병가를 쓰다.

이번주 수요일 부터인가 몸살에 걸렸었다.

당일에는 그게 몸살인지 모르고 그냥 피곤해서 그런가 했는데 상태가 점점 안좋아져서 일단 타이레놀을 먹으면서 버텼다.

 

그렇게 목요일이 되고, 주변 사람들이 몸살이면 좀 쉬면 낫는다, 병원에 좀 가라, 그러다 스노우볼 굴러간다 며

쉬라고 하길래 마음속으로 금요일 아침까지 상태가 호전되지 않으면 금요일까지 버티기로 하였다.

그런데 금요일에도 상태가 호전되지 않아서 결국 병가를 내고 병원에서 약을 타오게 되었다.

 

물론 공부하는것도 중요하고 건강도 중요하지만 쉰다는건 대체 어떻게 하는건지 잘 모르겠다.

그냥 유튜브나 보면서 놀면되는건가? 침대에 누워만 있으면 되는건가? 약먹고 잠만 자면 되는건가?

 

내 기준에선 뭐가 됐든 시간낭비 같이 느껴졌다.

하루라도 빠지면 뒤쳐진다는 생각이 들었다.

아마 다른 사람들도 그렇게 생각하고 몸을 혹사시키다가 상태가 나빠져서 나한테 그런 조언을 해준거겠지

 

결국 금요일에는 약을 먹고 팀 프로젝트를 위한 공부를 시작했다.

쉴때는 쉬어라. 어떻게 쉬는게 쉬는건지 그걸 다시 생각해보는 한 주가 되었다.

프로젝트 개요

이 프로젝트는 한화시스템 BEYOND SW CAMP 2번째 팀프로젝트로써 1월 말부터 시작하였다.

 

'모여봄'은 팀 프로젝트 모집을 하는 사이트이다.

팀 프로젝트를 진행하기 위해서 팀원들을 모집하고 팀을 꾸려 프로젝트를 완성하고,

그것을 정리하여 이력서 처럼 정리하여 출력해주는 기능을 가지고 있다.

 

기술 스택

백엔드 : Spring Boot

프론트 : Vue.Js

DB : MariaDB

 

맡은 역활

백엔드에서 팀 관련 기능 개발을 맡았고, 프론트에 대해서도 공부하여 적용할 예정이다.

 

이 블로그에 팀 관련 기능에 대한 코드들을 상세히 리뷰하고 정리하여 글을 올릴 예정이다.

'백엔드 > Spring Boot' 카테고리의 다른 글

모여봄 #4 팀 관련 추가 기능들 구현  (0) 2025.03.08
모여봄 #4 팀 조회 페이징 추가  (0) 2025.03.08
모여봄 #3 팀 조회 기능  (1) 2025.03.08
모여봄 #2 CRUD 구현  (0) 2025.03.02

바쁘게 흘러간 한 주

이번주는 어느때 보다 바쁘게 흘러갔다.

이전에 작성해놓은 우선순위에 따라서 팀 프로젝트를 최우선으로 두고 작업한 결과

거의 대부분을 팀프로젝트에 시간을 쏟아 부었다.

물론 다른 일들도 중요하지만 지금은 팀 프로젝트가 더 중요하다고 판단했기

 

이전에 작성해둔 기능 명세서를 기반으로 기능을 개발하기 시작하였는데

모두들 열심히 참여해준 덕에 빠르게 개발이 진행되었다.

 

이번에 이렇게 개발을 하면서 다시금 느낀 감정은

재미있다. 그냥 즐겁다 였다.

너무 재밌어서 시간가는줄 모르고 기능 개발을 했다.

 

그러니깐 기능 하나를 두고 어떻게 구현해야하지? 왜 이렇게는 안될까? 어디서 문제가 발생한거지?

하나하나 그려보고 생각하고 고민한 끝에 결국 해냈을때 나오는 성취감이 정말 좋았다.

 

원래도 그런것을 좋아하는 편이였지만 이번에 다시 경험해보니 정말 즐거운 시간을 보낼수있었다.

물론 하루종일 그것만 붙잡고 있는 편은 아니지만 그래도 하루가 짧게 느껴진건 정말 오랜만이다.

팀의 재구성과 자리 재배치

이번에도 갑작스런 소식이 전해졌다.

그것은 바로 팀원이 교체된다는 소식이였다.

 

그 팀원이 여기서 이루어낸게 많은데 그걸 다 두고 떠난다니 아쉽긴 했지만,

내가 해야할일은 변치 않았기에 별로 신경쓰진 않았다.

 

어떤 일이 있어도 자신이 맡은 직무에 최선을 다해야 한다고 생각하는 편이기에

이는 책임 회피라고 생각했고 이런 일은 조금 지양해야한다는 생각이 들었다.

 

목요일 저녁에는 자리를 재배치 한다는 공지와 함께 팀원들끼리 같은 자리를 쓸수있도록 재배치 되었다.

정든 짝꿍을 보내고 우리 팀원과 함께한다는건 사실 그닥 내키진 않았지만 오히려 항시 같이 있으므로 더 원활하고

빠른 소통과 피드백이 가능하다는 점에서 좋았던 것 같다.

 

이번에도 이루지 못한 계획들

분명 블로그에 글을 쓴다고 했는데 팀프로젝트에 빠져서 글을 쓰지 못했다.

그러니 오늘 바로 노션에 틈틈히 정리한 내용을 정리해서 이 글을 쓰자마자 올려야겠다.

 

또, 책을 읽으려고 친구한테서 책도 빌렸는데

그 마저도 표지도 못넘겼다. 시작이 반이라더니 아직 시작도 못한거 보면 맞는 말인것 같다.

 

다음주는 한발자국 더 나아가야겠다.

팀 프로젝트 일정을 바로잡다.

이번 주에는 정말 많은 일이 있었는데 그 중 가장 큰 것은 팀프로젝트의 균열이다.

 

저번주에 계획했듯 나는 이번 주에도 리액트 공부를 했다.

매일 일정 챕터까지 들으며 노션에 정리하고 학습하는 시간을 가졌다.

 

그러다 수요일쯤 조원 중 한분이 저녁에 긴급 호출을 하였고,

그 자리에서 조장이 본인으로 바뀌었음과, 지금까지 프로젝트에 무엇을 기여했는지에 대한 질문을 하였다.

 

내 입장에서는 할말이 없었다.

팀 프로젝트를 위해서 리액트를 공부했건만 정작 중요한 백엔드 부분의 진행사항은 0%였고,

마지막으로 한건 일주일전에 간단한 CRUD를 하고 커밋한게 전부였다.

 

무엇이 잘못되었던걸까?

내가 생각할 때 여러가지 문제가 있었는데

 

첫째로 팀원들과의 소통 부족으로 각자 팀원들이 어떤 작업을 하고 있는지 몰랐다.

둘째로 처음 계획했던 Jira를 활용한 일정관리는 아무도 사용하지 않아 폐기됐고

셋째로 팀장이 모두 혼자 백엔드 작업을 하였기에 그동안 팀원들에게 내려진 지시가 없었다.

넷째로 팀원들도 프로젝트에 크게 관심이 없었다. 모두 열정적이였지만 그래서 어떻게 해야하나에 대해서는 아무도 답하지 못했다.

 

어떻게 개선하였나

목요일에 정기 회의를 하여 팀 프로젝트의 방향성, 일정이 많이 잘못되었음을 인지하고

이를 바로 고치기위해 짧고 굵게 일정을 다시 조정했다.

 

나의 경우 리액트 공부는 잠시 접어두고 엔티티 설계와 기능 개발을 하기로 하였고,

기간 제한을 두어 정해진 기간안에 기능을 개발하고, 중간 점검의 시간을 가지기로 하였다.

 

또한 팀원들과의 의사소통을 강화하기 위해서 디스코드를 활성화하고, 공지 등의 기능을 활용하여

팀원들 간의 중요한 정보 공유를 하였다.

한주를 마무리 하며.

참 아쉬운 점도 많았고 배운점도 많은 한 주였다.

 

아쉬운 점은 2번째 팀프로젝트 였지만 실질적인 개발은 처음이였기에 나 같이 이러한 팀 프로젝트를 경험한 사람이 있는데 반해

안해본 사람이 더 많았고 나 또한 부족한 점이 많아서 이러한 일정 문제가 생겼었다.

 

팀 프로젝트는 단순히 나 혼자 잘하는게 중요한게 아니라

팀원들과의 소통, 철처한 일정관리, 역할분담 등이 매우 중요하는걸 또 다시 배웠다.

 

처음에는 분명 잘 진행이 되고있다고 생각했지만, 날이 가면 갈수록 계획한대로 되지않았다.

다음 프로젝트 때는 꼭 그러한 부분을 수정하여 진행하자 다짐했었고, 그렇게 시작은 좋았지만

지속적인 관리가 없으면 의미가 없다는 사실을 깨달았다.

 

지금이라도 흐름을 다시 잡고 프로젝트를 진행하고 있으니 마지막엔 좋은 결과가 나올수 있도록 노력해야겠다.

 

https://www.acmicpc.net/problem/2798

문제

N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.

입력

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다.

합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.

출력

첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.

풀이

부르트포스 알고리즘을 활용하는 문제로써 무작정 대입하여 해결하면 된다.

  1. n과 m을 입력받고 n 크기의 배열을 생성한다.
  2. 배열에 n 개의 값을 입력받는다.
  3. 3중 for문을 사용하여 모든 경우의 수를 더해본다
    1. 3개의 값을 입력받기 때문에 1번째 for문은 n - 2 만큼 반복한다
    2. 2번재 for문은 i + 1 부터 n 까지 만큼 반복한다
    3. 3번재 for문은 j+ 1 부터 n 까지 만큼 반복한다
    4. 3개의 값을 모두 더한 다음 m과 같다면 해당 값을 반환
    5. 더한 값이 m보다  작다면 현재 저장된 값과 비교하여 더 큰값을 저장하고 반복
    6. 반복이 끝나면 저장된 값을 반환
  4. 결과를 출력

아래는 이를 구현한 코드이다.

중간에  값을 반환하기 위해 연산하는 부분은 메서드로 분리하여 작성하였다.

더보기
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();


        int[] arr = new int[n];

        for(int i = 0; i < n; i++){
            arr[i] = sc.nextInt();
        }

        System.out.println(sum(arr, m));
    }

    public static int sum(int[] arr, int m){
        int sum, result = 0;

        for(int i = 0; i < arr.length-2; i++){
            for(int j = i+1; j < arr.length; j++){
                for(int k = j+1; k < arr.length; k++){
                    sum = arr[i] + arr[j] + arr[k];
                    if (sum == m){
                        return sum;
                    }else if (sum <= m){
                        result = Math.max(result, sum);
                    }
                }
            }
        }
        return result;
    }
}

 

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

2753번 윤년 / 백준 문제 추천  (0) 2025.04.05
17389번 보너스 점수  (0) 2025.04.03
3009번 네 번째 점  (1) 2025.02.11
11653번 소인수분해  (1) 2025.02.10
2581번 소수  (1) 2025.02.08

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

풀이

문제에서 주어진 좌표를 자세히 보면 직사각형이기에 서로 두번씩 반복됨을  알수있다.

예제
30 20
10 10
10 20

출력
30 10

 

그러니깐 단순하게 생각하면 x좌표와 y좌표에서 각각 1번씩만 나온 숫자를 출력하면 된다.

결국 중복을 어떻게 처리하는지 구현하는 문제이다.

 

- 단순하게 풀이

더보기
  1. 모든 값을 따로 입력받는다.
  2. 1번째 x의 값과 2번째 x의 값을 비교해서 서로 다르고
    1. 1번째 x의 값과 3번째 x의 값이 같다면 1번째 값 저장
    2. 2번째 x의 값과 3번째 x의 값이 같다면 2번재 값 저장
  3. y도 동일하게 진행
  4. 저장된 값을 형식에 맞춰 출력
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();

        int c = sc.nextInt();
        int d = sc.nextInt();

        int ra = sc.nextInt();
        int rb = sc.nextInt();

        if (a != c){
            if (a == ra) ra = c;
            else if (c == ra) ra = a;
        }
        if (b != d){
            if (b == rb) rb = d;
            else if (d == rb) rb = b;
        }
        
        System.out.printf("%d %d", ra, rb);
    }
}

 

이번 문제는 입력받을 수의 숫자가 정해져있어서 굳이 반복문을 쓸 필요가 없었다.

 

- 해시맵을 활용하여 풀이

더보기
  1. 두개의 해시맵을 생성
  2. 반복문으로 3번씩 반복한다.
    1. a가 mapa의 키와 같다면 값 증가
    2. 아니면 새로 추가
    3. 이 작업을 b에서도 동일하게 진행
  3. 맵을 반복하여 값이 1인 키를 찾아 형식에 맞춰 출력
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        HashMap<Integer, Integer> mapa = new HashMap<>();
        HashMap<Integer, Integer> mapab = new HashMap<>();

        Scanner sc = new Scanner(System.in);
        int a ,b;

        for (int i = 0; i < 3; i++) {
            a = sc.nextInt();
            b = sc.nextInt();

            if(mapa.containsKey(a)) mapa.put(a, mapa.get(a) + 1);
            else mapa.put(a, 1);

            if(mapab.containsKey(b)) mapab.put(b, mapab.get(b) + 1);
            else mapab.put(b, 1);
        }

        for (Map.Entry<Integer, Integer> entry : mapa.entrySet()) {
            if(entry.getValue() == 1) System.out.print(entry.getKey() + " ");
        }
        for (Map.Entry<Integer, Integer> entry : mapab.entrySet()) {
            if(entry.getValue() == 1) System.out.print(entry.getKey());
        }
    }
}

 

제일 처음 생각한 방법이지만 제일 느리고 복잡한 방법이였다.

이전에 중복을 찾을때 해시맵을 사용한 기억이 있어서 이를 활용해보았었지만

이 문제에는 그닥 좋은 방법은 아닌 것 같다.

 

 

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

17389번 보너스 점수  (0) 2025.04.03
2798번 블랙잭  (1) 2025.02.13
11653번 소인수분해  (1) 2025.02.10
2581번 소수  (1) 2025.02.08
1978번 소수 찾기  (1) 2025.02.07

https://www.acmicpc.net/problem/11653

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

풀이

간단한 소인수분해 문제이다.

 

처음에는 for문을 써서 반복을 하려고 했지만 그렇게 하기엔 n의 범위가 정해져있지도 않고 랜덤하기에

while문을 이용해서 n의 값이 1이 되면 멈추게 만들었다.

  1. 정수 n을 입력받고, n을 나눌 값 i를 2로 초기화 해준다.
  2. while문으로 n이 1이 아니면  반복시킨다. (더이상 나눌값이 없다면 멈춤)
  3. n을 i로 나눈 나머지가 0이라면
    1. i를 출력한다.
    2. n의 값을 n/i 로 설정한다.
    3. i의 값을 2로 재설정한다.
  4. 나머지가 0이 아니라면 i의 값을 증가시킨다.
  5. 더이상 나눌 값이 없으면  n이 1이 되므로 반복문은 종료된다.
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int i = 2;

        while(n != 1){
            if (n % i == 0) {
                System.out.println(i);
                n /= i;
                i = 2;
            }else {
                i++;
            }
        }
    }
}

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

2798번 블랙잭  (1) 2025.02.13
3009번 네 번째 점  (1) 2025.02.11
2581번 소수  (1) 2025.02.08
1978번 소수 찾기  (1) 2025.02.07
9506번 약수들의 합  (2) 2025.02.06

즐거웠던 설 연휴

정말 긴 설 연휴가 끝나고 다시 일상으로 돌아왔다.

그동안 일주일 넘게 쉬면서 마음가짐도 많이 느슨해졌고 이참에 다시 한번 정신차리고 되새김을 해야한다 생각했다.

 

설 이전에는 항상 시간이 촉박하다 느껴졌었고, 실제로도 너무 많은걸 하루안에 다 하려고 하다보니 스트레스도 많이 받았다.

이를 해결하기위해 나의 하루, 일주일에 우선순위를 도입했다.

 

예를 들어서 만약 여러가지 일을 계획하였을 때 그 중에서 내가 당장 급하게 이번 주 안에 끝내야할 일이 있다면,

그 일을 1순위로 두고 나머지 일들을 중요도에 따라 나열하여 순서대로 처리한다.

 

이제 여기서 중요한건 그 모든일을 하루만에 끝낼 필요도 없다는 것이고, 그것 때문에 스트레스 받지 않을 수 있다.

그래서 지금 내가 계획했던 일들을 하나하나 쪼개고 분리하여 습관처럼 해야하는 일 빼고 나머지를 정리해보았다.

나의 우선순위

  1. 팀프로젝트 (스프링, 리액트 공부)
  2. CKA 준비 ( 쿠버네티스 자격증 )
  3. 매일 코딩 문제 풀기
  4. 자소서 작성 연습
  5. 개인 프로젝트 꿈.찾.사 보수

지금 내게 있어 가장 중요한건 팀프로젝트이고, 가장 중요하지 않은건 내 개인 프로젝트를 보수하는 일이라고 정했다.

나는 매일 이 모든 일들을 하루만에 다 한다고 생각하는게 아니라 할수 있는만큼, 그리고 여유가 있을때 마다 하기로 정했다.

 

이번주는 우선순위에 맞춰서 스프링과 리액트를 공부하고 팀원들과 회의를 통해서 프로젝트를 조금씩 진행해 나갔다.

CKA의 경우에는 이전까지 공부했던 내용을 다시 블로그에 정리해서 리마인드 하면서 진행하려고 계획했다.

 

이번주에는 비록 내가 맞춰놓은 우선순위와 계획에 맞춰서 진행하지는 못했지만, 그래도 이러한 틀을 세워두니

마음의 여유가 조금 생기고 시간적으로도 여유가 생겼다.

 

강의시간에 배운 내용도 매일 노션에 정리하고 있는데 이 내용을 블로그에 정리해서 올려도 되는지 모르겠다.

이번에 한번 물어보고 강의 내용도 정리해서 블로그에 작성해서 리마인드 하려고 한다.

이 계획도 계획만 세워놓고 또 안할지도 모르겠지만 시작이 어렵지 한번 올리고 나면 꾸준히 올릴거라 믿는다.

 

진로에 대해서 한번 더 고민하다

이번 주에 진로에 대해서 한번 더 고민하는 시간을 가졌다.

친구에게 전화가 와서 네트워크 엔지니어에 관심이 있다면 CCNA 자격증을 따는걸 추천한다 라는 내용으로 전화가 왔었다.

그 친구의 아버지가 그쪽 일을 하시는데 사람이 없다며 너는 관련된 공부를 했으니 한번 도전해보는게 어떻냐 라고 물어보았다.

 

나도 사실 그쪽에 관심이 없는건 아니였다.

군대에서 전산병으로 근무하면서 기사님들의 어깨너머로 본것도 있고,

개인적으로 네트워크에도 관심이 많아서 대학생 때 그쪽 관련해서 자격증 등에 대해서 알아본 적이 있다.

 

하지만 지금의 나는 클라우드나 인프라쪽으로 가기로 정했고, 또 내가 공부한 것 들과 지금 배우고 있는것 앞으로 딸 자격증까지

모두 그쪽이랑은 조금 거리가 있다. 그래서 고민 끝에 지금 내가 가는 길을 가기로 했다.

이 결정을 하면서 이런 저런 생각을 정말 많이 했고, 덕분에 시야가 조금 더 넓어졌다고 생각한다.

 

자소서를 작성하며 부족한 점을 알아갔다

이번 설에 자기소개서를 작성한 적이 있었다.

결국 제 시간안에 완성하지 못해서 제출을 못했지만, 많은 배움이 있었다.

 

글을 작성하고 친구에게 검토받고 다시 작성하고 지우고 쓰고... 반복의 연속이였기에

이번주에도 그에 관련해서 머리속 한 구석에서 생각하고 있었다.

 

그러다 내 자소서의 문제점을 어렴풋이 깨닫게 되었다.

 

나는 보통 자소서를 작성할 때, 이런식으로 작성했었다.

저는 ~프로젝트를 진행해보았고 ~문제점이 있어서 ~해결했습니다.

 

 

그런데 다시 생각해보니 기업에서 원하는건 내가 어떤 프로젝트를 했는가가 아니고

내가 프로젝트를 진행하면서 어떤 문제에 직면했고, 어떻게 그 문제를 해결했는가가 더 중요하단걸 느꼈다.

 

분명 매번 자소서를 쓸때마다 질문에도 적혀있었고 친구도 매번 그 부분을 지적했는데 왜 놓치고 있었을까.

어차피 내가 회사에 들어가도 다 새로 배워야 하는것들 투성이고, 내가 해봤던 프로젝트와 비슷한 프로젝트를 할 가능성도 낮다.

 

회사가 원하는건 어떤 프로젝트를 하던간에 문제를 해결할 수 있는 능력을 가진 사람을 원하는 것이었단걸

팀원들과 소통하고 문제에 대해 고민하고 해결책을 내놓을수 있는 사람을 원했다는걸 알았다.

 

이제서라도 알았으니 다음에 자소서를 쓸 때는 그 부분을 중점으로 써야겠다. 라고 생각하니

이제껏 내가 했던 프로젝트에서 생겼던 문제들과 적을 내용들이 생각이 났다.

 

분명 자리에 앉아서 쓸 때는 생각이 안났고, 실제로 그런쪽으로  고민해본적도 없었는데 새로운 경험이였다.

이번에 배운것을 토대로 계속 글을 쓰는 연습을 하면서 자소서를 준비해야 겠다는 생각이 드는 한 주였다.

 

Ps. 이번에 개인적으로 일기도 작성하고 있는데 하루동안 나의 활동을 되돌아보는 좋은 시간이 되고있다.

+ Recent posts