프로그래머스 정수를 나선형으로 배치하기 JAVA 풀이 (구현, 시뮬레이션)

2026. 6. 26. 18:19·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

n × n 크기의 배열에 1부터 n²까지의 숫자를 시계 방향의 나선형으로 채우는 문제이다.

배열의 시작 위치는 (0, 0)이며, 오른쪽으로 이동하다가 더 이상 진행할 수 없으면 아래, 왼쪽, 위 순서로 방향을 변경하며 모든 칸을 채운다.


📌 접근 방법

현재 위치와 방향을 관리하면서 1부터 n²까지 순서대로 배열에 저장한다.

다음 이동할 좌표를 미리 계산한 뒤, 배열 범위를 벗어나거나 이미 방문한 칸이라면 방향을 시계방향으로 변경한다.

 

방향이 변경되면 새로운 방향으로 다음 좌표를 다시 계산한 후 이동을 반복한다.


📌 핵심 아이디어

1. 방향 배열 사용

오른쪽, 아래, 왼쪽, 위 방향을 배열로 관리한다.

int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};

각 방향은 다음과 같다.

dir 방향
0 →
1 ↓
2 ←
3 ↑

2. 다음 좌표 계산

현재 방향을 이용해 다음 이동할 좌표를 계산한다.

int nx = x + dx[dir];
int ny = y + dy[dir];

현재 위치는 그대로 유지하고, 이동 가능한지 먼저 확인하기 위해 다음 좌표를 미리 계산한다.


3. 방향 변경

다음 위치가 범위를 벗어나거나 이미 방문한 칸이라면 방향을 변경한다.

if (nx >= n || ny >= n || nx < 0 || ny < 0 || answer[nx][ny] != 0) {
    dir = (dir + 1) % 4;

    nx = x + dx[dir];
    ny = y + dy[dir];
}

(dir + 1) % 4를 사용하면

오른쪽 → 아래 → 왼쪽 → 위 → 오른쪽

순으로 방향이 반복된다.


4. 다음 위치로 이동

방향이 결정되면 다음 좌표로 이동한다.

x = nx;
y = ny;

이 과정을 n²개의 숫자를 모두 채울 때까지 반복하면 된다.


📌 전체 코드

import java.util.Arrays;

public class No41 {
    public static void main(String[] args) {
        int n = 4;
        int num = 1;

        int[][] answer = new int[n][n];

        int[] dx = {0, 1, 0, -1};
        int[] dy = {1, 0, -1, 0};

        int x = 0;
        int y = 0;
        int dir = 0;

        while (num <= n * n) {
            answer[x][y] = num++;

            int nx = x + dx[dir];
            int ny = y + dy[dir];

            if (nx >= n || ny >= n || nx < 0 || ny < 0 || answer[nx][ny] != 0) {
                dir = (dir + 1) % 4;
                nx = x + dx[dir];
                ny = y + dy[dir];
            }

            x = nx;
            y = ny;
        }

        System.out.println(Arrays.deepToString(answer));
    }
}
 

📄 정리

  • 방향 배열(dx, dy)을 사용하면 이동 로직을 간결하게 구현할 수 있다.
  • 다음 좌표를 먼저 계산한 뒤 이동 가능 여부를 판단하는 것이 핵심이다.
  • (dir + 1) % 4를 이용하면 시계방향 회전을 쉽게 구현할 수 있다.
  • 구현 및 시뮬레이션 문제에서 자주 사용하는 패턴이므로 익혀두면 다양한 문제에 활용할 수 있다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현)  (0) 2026.06.27
프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현)  (0) 2026.06.26
프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수)  (0) 2026.06.25
프로그래머스 창고 정리 JAVA 풀이  (0) 2026.06.24
프로그래머스 숫자의 표현 JAVA 풀이 (투 포인터, 슬라이딩 윈도우)  (0) 2026.06.23
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현)
  • 프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현)
  • 프로그래머스 신호등 정전 JAVA 풀이 (시뮬레이션, 최소공배수)
  • 프로그래머스 창고 정리 JAVA 풀이
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    기출문제
    브루트포스
    수학
    피보나치
    시뮬레이션
    Level2
    level1
    프로그래머스
    java
    정처기오답노트
    자료구조
    백준
    알고리즘
    정처기
    문자열
    정렬
    정보처리기사 실기 기출문제
    실기
    solved.ac
    springboot
    정보처리기사
    정처기실기
    level0
    배열
    dp
    완전탐색
    구현
    백엔드개발자
    자바
    코딩테스트
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 정수를 나선형으로 배치하기 JAVA 풀이 (구현, 시뮬레이션)
상단으로

티스토리툴바